kernel_samsung_a34x-permissive/drivers/power/supply/mediatek/charger/mtk_intf.c
2024-04-28 15:51:13 +02:00

253 lines
4.9 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2021 MediaTek Inc.
*/
#include "mtk_intf.h"
static struct charger_manager *pinfo;
int charger_is_chip_enabled(bool *en)
{
return charger_dev_is_chip_enabled(pinfo->chg1_dev, en);
}
int charger_enable_chip(bool en)
{
return charger_dev_enable_chip(pinfo->chg1_dev, en);
}
int charger_is_enabled(bool *en)
{
return charger_dev_is_enabled(pinfo->chg1_dev, en);
}
int charger_get_mivr_state(bool *in_loop)
{
return charger_dev_get_mivr_state(pinfo->chg1_dev, in_loop);
}
int charger_get_mivr(u32 *uV)
{
return charger_dev_get_mivr(pinfo->chg1_dev, uV);
}
int charger_set_mivr(u32 uV)
{
return charger_dev_set_mivr(pinfo->chg1_dev, uV);
}
int charger_get_input_current(u32 *uA)
{
return charger_dev_get_input_current(pinfo->chg1_dev, uA);
}
int charger_set_input_current(u32 uA)
{
return charger_dev_set_input_current(pinfo->chg1_dev, uA);
}
int charger_set_charging_current(u32 uA)
{
return charger_dev_set_charging_current(pinfo->chg1_dev, uA);
}
int charger_get_ibus(u32 *ibus)
{
return charger_dev_get_ibus(pinfo->chg1_dev, ibus);
}
int charger_set_constant_voltage(u32 uV)
{
return charger_dev_set_constant_voltage(pinfo->chg1_dev, uV);
}
int charger_enable_termination(bool en)
{
return charger_dev_enable_termination(pinfo->chg1_dev, en);
}
int charger_enable_powerpath(bool en)
{
return charger_dev_enable_powerpath(pinfo->chg1_dev, en);
}
int charger_force_disable_powerpath(bool disable)
{
return charger_manager_force_disable_power_path(pinfo->chg1_consumer,
MAIN_CHARGER, disable);
}
int charger_dump_registers(void)
{
return charger_dev_dump_registers(pinfo->chg1_dev);
}
int adapter_set_1st_cap(int mV, int mA)
{
return adapter_dev_set_cap(pinfo->pd_adapter,
MTK_PD_APDO_START, mV, mA);
}
int adapter_set_cap(int mV, int mA)
{
int ret;
ret = adapter_dev_set_cap(pinfo->pd_adapter, MTK_PD_APDO, mV, mA);
if (ret == MTK_ADAPTER_REJECT)
return ADAPTER_REJECT;
else if (ret != 0)
return ADAPTER_ERROR;
return ADAPTER_OK;
}
int adapter_set_cap_start(int mV, int mA)
{
int ret;
ret = adapter_dev_set_cap(pinfo->pd_adapter, MTK_PD_APDO_START, mV, mA);
if (ret == MTK_ADAPTER_REJECT)
return ADAPTER_REJECT;
else if (ret != 0)
return ADAPTER_ERROR;
return ADAPTER_OK;
}
int adapter_set_cap_end(int mV, int mA)
{
int ret;
ret = adapter_dev_set_cap(pinfo->pd_adapter, MTK_PD_APDO_END, mV, mA);
if (ret == MTK_ADAPTER_REJECT)
return ADAPTER_REJECT;
else if (ret != 0)
return ADAPTER_ERROR;
return ADAPTER_OK;
}
int adapter_get_output(int *mV, int *mA)
{
return adapter_dev_get_output(pinfo->pd_adapter, mV, mA);
}
int adapter_get_pps_cap(struct pps_cap *cap)
{
struct adapter_power_cap tacap = {0};
int i;
adapter_dev_get_cap(pinfo->pd_adapter, MTK_PD_APDO, &tacap);
cap->selected_cap_idx = tacap.selected_cap_idx;
cap->nr = tacap.nr;
cap->pdp = tacap.pdp;
for (i = 0; i < tacap.nr; i++) {
cap->pwr_limit[i] = tacap.pwr_limit[i];
cap->max_mv[i] = tacap.max_mv[i];
cap->min_mv[i] = tacap.min_mv[i];
cap->ma[i] = tacap.ma[i];
cap->maxwatt[i] = tacap.maxwatt[i];
cap->minwatt[i] = tacap.minwatt[i];
cap->type[i] = tacap.type[i];
}
return 0;
}
int adapter_get_status(struct ta_status *sta)
{
struct adapter_status tasta = {0};
int ret = 0;
ret = adapter_dev_get_status(pinfo->pd_adapter, &tasta);
sta->temperature = tasta.temperature;
sta->ocp = tasta.ocp;
sta->otp = tasta.otp;
sta->ovp = tasta.ovp;
return ret;
}
int adapter_is_support_pd_pps(void)
{
if (pinfo->pd_type == MTK_PD_CONNECT_PE_READY_SNK_APDO)
return true;
return false;
}
int adapter_get_cap(struct pd_cap *cap)
{
struct adapter_power_cap tacap = {0};
int i;
adapter_dev_get_cap(pinfo->pd_adapter, MTK_PD, &tacap);
cap->selected_cap_idx = tacap.selected_cap_idx;
cap->nr = tacap.nr;
for (i = 0; i < tacap.nr; i++) {
cap->max_mv[i] = tacap.max_mv[i];
cap->min_mv[i] = tacap.min_mv[i];
cap->ma[i] = tacap.ma[i];
cap->maxwatt[i] = tacap.maxwatt[i];
cap->minwatt[i] = tacap.minwatt[i];
cap->type[i] = tacap.type[i];
}
return 0;
}
#if defined(CONFIG_BATTERY_SAMSUNG)
bool adapter_is_src_usb_suspend_support(void)
{
return adapter_dev_is_src_usb_suspend_support(pinfo->pd_adapter);
}
bool adapter_is_src_usb_communication_capable(void)
{
return adapter_dev_is_src_usb_communication_capable(pinfo->pd_adapter);
}
#endif
int adapter_is_support_pd(void)
{
if (pinfo->pd_type == MTK_PD_CONNECT_PE_READY_SNK ||
pinfo->pd_type == MTK_PD_CONNECT_PE_READY_SNK_PD30)
return true;
if (pinfo->pd_type == MTK_PD_CONNECT_PE_READY_SNK_APDO &&
pinfo->enable_pe_4 == false &&
pinfo->enable_pe_5 == false)
return true;
return false;
}
int set_charger_manager(struct charger_manager *info)
{
if (pinfo == NULL)
pinfo = info;
return 0;
}
int enable_vbus_ovp(bool en)
{
charger_enable_vbus_ovp(pinfo, en);
return 0;
}
int wake_up_charger(void)
{
if (pinfo != NULL)
_wake_up_charger(pinfo);
return 0;
}