static enum manta_charge_source
detect_charge_source(enum charge_connector conn, bool online,
		     bool force_dock_redetect, bool usbin_redetect)
{
	enum manta_charge_source charge_source;
	int ret;

	manta_bat_dock = false;

	if (!online) {
		if (conn == CHARGE_CONNECTOR_POGO)
			manta_pogo_set_vbus(online, NULL);
		return MANTA_CHARGE_SOURCE_NONE;
	}

	charge_source = force_dock_redetect ?
		MANTA_CHARGE_SOURCE_USB :
		check_samsung_charger(conn, usbin_redetect);

	if (conn == CHARGE_CONNECTOR_POGO &&
	    charge_source == MANTA_CHARGE_SOURCE_USB) {
		ret = manta_pogo_set_vbus(online, &charge_source);
		manta_bat_dock = ret >= 0;
	}

	return charge_source;
}
Example #2
0
static int sec_bat_charging_control(struct chg_data *chg)
{
    static enum cable_type_t prev_cable_status = CABLE_TYPE_NONE;
    static bool prev_charging = false;
    int ret;

    if(chg->cable_status != prev_cable_status || chg->charging != prev_charging)
    {
        /* disable max8998 charer */
        if(chg->pdata->pmic_charger && chg->pdata->pmic_charger->charging_control) {
            ret = chg->pdata->pmic_charger->charging_control(0, chg->cable_status);
            if (ret < 0)
                goto err;
        }

        if (!chg->charging) {
            /* disable charging */
            gpio_set_value(GPIO_TA_EN, 1);	// External charger disable
        } else {
            /* enable charging */
            if(chg->pdata->external_charger && chg->pdata->external_charger->charging_control)
            {
                if ((chg->cable_status == CABLE_TYPE_AC) && !check_samsung_charger()) {
                    chg->pdata->external_charger->charging_control(1, CABLE_TYPE_IMPROPER_AC);  // Improper charger
                    chg->bat_info.batt_improper_ta = true;  // Improper charger
                }
                else {
                    chg->pdata->external_charger->charging_control(1, chg->cable_status);  // TA or USB cable
                }
            }

            gpio_set_value(GPIO_TA_EN, 0);	// External charger enable

            // Stop low battery compensation algorithm
            if(chg->pdata && chg->pdata->fuelgauge_cb)
                chg->pdata->fuelgauge_cb(REQ_LOW_BATTERY_COMPENSATION, 0, 0);
        }

        /* update previous status values */
        prev_cable_status = chg->cable_status;
        prev_charging = chg->charging;
    }
    else
    {
        // do nothing... status is same as previous one.
    }

    return 0;
err:
    pr_err("max8998_read_reg error\n");
    return ret;
}