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; }
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; }
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; }
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; }