/* Charger is OFF. */ #define MAX77650_CHG_OFF 0x00 /* Charger is in prequalification mode. */ #define MAX77650_CHG_PREQ 0x01 /* Charger is in fast-charge constant current mode. */ #define MAX77650_CHG_ON_CURR 0x02 /* Charger is in JEITA modified fast-charge constant-current mode. */ #define MAX77650_CHG_ON_CURR_JEITA 0x03 /* Charger is in fast-charge constant-voltage mode. */ #define MAX77650_CHG_ON_VOLT 0x04 /* Charger is in JEITA modified fast-charge constant-voltage mode. */ #define MAX77650_CHG_ON_VOLT_JEITA 0x05 /* Charger is in top-off mode. */ #define MAX77650_CHG_ON_TOPOFF 0x06 /* Charger is in JEITA modified top-off mode. */ #define MAX77650_CHG_ON_TOPOFF_JEITA 0x07 /* Charger is done. */ #define MAX77650_CHG_DONE 0x08 /* Charger is JEITA modified done. */ #define MAX77650_CHG_DONE_JEITA 0x09 /* Charger is suspended due to a prequalification timer fault. */ #define MAX77650_CHG_SUSP_PREQ_TIM_FAULT 0x0a /* Charger is suspended due to a fast-charge timer fault. */ #define MAX77650_CHG_SUSP_FAST_CHG_TIM_FAULT 0x0b /* Charger is suspended due to a battery temperature fault. */ #define MAX77650_CHG_SUSP_BATT_TEMP_FAULT 0x0c
staticint max77650_charger_set_vchgin_min(struct max77650_charger_data *chg, unsignedint val)
{ int i, rv;
for (i = 0; i < ARRAY_SIZE(max77650_charger_vchgin_min_table); i++) { if (val == max77650_charger_vchgin_min_table[i]) {
rv = regmap_update_bits(chg->map,
MAX77650_REG_CNFG_CHG_B,
MAX77650_CHARGER_VCHGIN_MIN_MASK,
MAX77650_CHARGER_VCHGIN_MIN_SHIFT(i)); if (rv) return rv;
return 0;
}
}
return -EINVAL;
}
staticint max77650_charger_set_ichgin_lim(struct max77650_charger_data *chg, unsignedint val)
{ int i, rv;
for (i = 0; i < ARRAY_SIZE(max77650_charger_ichgin_lim_table); i++) { if (val == max77650_charger_ichgin_lim_table[i]) {
rv = regmap_update_bits(chg->map,
MAX77650_REG_CNFG_CHG_B,
MAX77650_CHARGER_ICHGIN_LIM_MASK,
MAX77650_CHARGER_ICHGIN_LIM_SHIFT(i)); if (rv) return rv;
return 0;
}
}
return -EINVAL;
}
staticint max77650_charger_enable(struct max77650_charger_data *chg)
{ int rv;
rv = regmap_update_bits(chg->map,
MAX77650_REG_CNFG_CHG_B,
MAX77650_CHARGER_CHG_EN_MASK,
MAX77650_CHARGER_ENABLED); if (rv)
dev_err(chg->dev, "unable to enable the charger: %d\n", rv);
return rv;
}
staticvoid max77650_charger_disable(struct max77650_charger_data *chg)
{ int rv;
rv = regmap_update_bits(chg->map,
MAX77650_REG_CNFG_CHG_B,
MAX77650_CHARGER_CHG_EN_MASK,
MAX77650_CHARGER_DISABLED); if (rv)
dev_err(chg->dev, "unable to disable the charger: %d\n", rv);
}
rv = regmap_read(chg->map, MAX77650_REG_STAT_CHG_B, ®); if (rv) {
dev_err(chg->dev, "unable to read the charger status: %d\n", rv); return IRQ_HANDLED;
}
switch (MAX77650_CHGIN_DETAILS_BITS(reg)) { case MAX77650_CHGIN_UNDERVOLTAGE_LOCKOUT:
dev_err(chg->dev, "undervoltage lockout detected, disabling charger\n");
max77650_charger_disable(chg); break; case MAX77650_CHGIN_OVERVOLTAGE_LOCKOUT:
dev_err(chg->dev, "overvoltage lockout detected, disabling charger\n");
max77650_charger_disable(chg); break; case MAX77650_CHGIN_OKAY:
max77650_charger_enable(chg); break; default: /* May be 0x10 - debouncing */ break;
}
return IRQ_HANDLED;
}
staticint max77650_charger_get_property(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val)
{ struct max77650_charger_data *chg = power_supply_get_drvdata(psy); int rv, reg;
switch (psp) { case POWER_SUPPLY_PROP_STATUS:
rv = regmap_read(chg->map, MAX77650_REG_STAT_CHG_B, ®); if (rv) return rv;
if (MAX77650_CHARGER_CHG_CHARGING(reg)) {
val->intval = POWER_SUPPLY_STATUS_CHARGING; break;
}
switch (MAX77650_CHG_DETAILS_BITS(reg)) { case MAX77650_CHG_OFF: case MAX77650_CHG_SUSP_PREQ_TIM_FAULT: case MAX77650_CHG_SUSP_FAST_CHG_TIM_FAULT: case MAX77650_CHG_SUSP_BATT_TEMP_FAULT:
val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; break; case MAX77650_CHG_PREQ: case MAX77650_CHG_ON_CURR: case MAX77650_CHG_ON_CURR_JEITA: case MAX77650_CHG_ON_VOLT: case MAX77650_CHG_ON_VOLT_JEITA: case MAX77650_CHG_ON_TOPOFF: case MAX77650_CHG_ON_TOPOFF_JEITA:
val->intval = POWER_SUPPLY_STATUS_CHARGING; break; case MAX77650_CHG_DONE:
val->intval = POWER_SUPPLY_STATUS_FULL; break; default:
val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
} break; case POWER_SUPPLY_PROP_ONLINE:
rv = regmap_read(chg->map, MAX77650_REG_STAT_CHG_B, ®); if (rv) return rv;
val->intval = MAX77650_CHARGER_CHG_CHARGING(reg); break; case POWER_SUPPLY_PROP_CHARGE_TYPE:
rv = regmap_read(chg->map, MAX77650_REG_STAT_CHG_B, ®); if (rv) return rv;
if (!MAX77650_CHARGER_CHG_CHARGING(reg)) {
val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE; break;
}
switch (MAX77650_CHG_DETAILS_BITS(reg)) { case MAX77650_CHG_PREQ: case MAX77650_CHG_ON_CURR: case MAX77650_CHG_ON_CURR_JEITA: case MAX77650_CHG_ON_VOLT: case MAX77650_CHG_ON_VOLT_JEITA:
val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST; break; case MAX77650_CHG_ON_TOPOFF: case MAX77650_CHG_ON_TOPOFF_JEITA:
val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE; break; default:
val->intval = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN;
} break; default: return -EINVAL;
}
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.