staticint tps65217_config_charger(struct tps65217_charger *charger)
{ int ret;
/* * tps65217 rev. G, p. 31 (see p. 32 for NTC schematic) * * The device can be configured to support a 100k NTC (B = 3960) by * setting the NTC_TYPE bit in register CHGCONFIG1 to 1. However it * is not recommended to do so. In sleep mode, the charger continues * charging the battery, but all register values are reset to default * values. Therefore, the charger would get the wrong temperature * information. If 100k NTC setting is required, please contact the * factory. * * ATTENTION, conflicting information, from p. 46 * * NTC TYPE (for battery temperature measurement) * 0 – 100k (curve 1, B = 3960) * 1 – 10k (curve 2, B = 3480) (default on reset) *
*/
ret = tps65217_clear_bits(charger->tps, TPS65217_REG_CHGCONFIG1,
TPS65217_CHGCONFIG1_NTC_TYPE,
TPS65217_PROTECT_NONE); if (ret) {
dev_err(charger->dev, "failed to set 100k NTC setting: %d\n", ret); return ret;
}
return 0;
}
staticint tps65217_enable_charging(struct tps65217_charger *charger)
{ int ret;
/* charger already enabled */ if (charger->online) return 0;
dev_dbg(charger->dev, "%s: enable charging\n", __func__);
ret = tps65217_set_bits(charger->tps, TPS65217_REG_CHGCONFIG1,
TPS65217_CHGCONFIG1_CHG_EN,
TPS65217_CHGCONFIG1_CHG_EN,
TPS65217_PROTECT_NONE); if (ret) {
dev_err(charger->dev, "%s: Error in writing CHG_EN in reg 0x%x: %d\n",
__func__, TPS65217_REG_CHGCONFIG1, ret); return ret;
}
/* check for charger status bit */ if (val & CHARGER_STATUS_PRESENT) {
ret = tps65217_enable_charging(charger); if (ret) {
dev_err(charger->dev, "failed to enable charger: %d\n", ret); return IRQ_HANDLED;
}
} else {
charger->online = 0;
}
if (charger->prev_online != charger->online)
power_supply_changed(charger->psy);
ret = tps65217_reg_read(charger->tps, TPS65217_REG_CHGCONFIG0, &val); if (ret < 0) {
dev_err(charger->dev, "%s: Error in reading reg 0x%x\n",
__func__, TPS65217_REG_CHGCONFIG0); return IRQ_HANDLED;
}
if (val & TPS65217_CHGCONFIG0_ACTIVE)
dev_dbg(charger->dev, "%s: charger is charging\n", __func__); else
dev_dbg(charger->dev, "%s: charger is NOT charging\n", __func__);
ret = tps65217_config_charger(charger); if (ret < 0) {
dev_err(charger->dev, "charger config failed, err %d\n", ret); return ret;
}
/* Create a polling thread if an interrupt is invalid */ if (irq[0] < 0 || irq[1] < 0) {
poll_task = kthread_run(tps65217_charger_poll_task,
charger, "ktps65217charger"); if (IS_ERR(poll_task)) {
ret = PTR_ERR(poll_task);
dev_err(charger->dev, "Unable to run kthread err %d\n", ret); return ret;
}
charger->poll_task = poll_task; return 0;
}
/* Create IRQ threads for charger interrupts */ for (i = 0; i < NUM_CHARGER_IRQS; i++) {
ret = devm_request_threaded_irq(&pdev->dev, irq[i], NULL,
tps65217_charger_irq,
IRQF_SHARED, "tps65217-charger",
charger); if (ret) {
dev_err(charger->dev, "Unable to register irq %d err %d\n", irq[i],
ret); return ret;
}
/* Check current state */
tps65217_charger_irq(-1, charger);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.