PD: Extend PD adapter class charge function

Extend PD adaper charge function for future PD IC
1. add pd idx select interface for config PDO
2. add MMI_PD_ALL for got all PDO info

Change-Id: Ic60270c3c4cf071044a50fdd56f546120ce7369c
Signed-off-by: chailu1 <chailu1@lenovo.com>
Reviewed-on: https://gerrit.mot.com/2115616
SLTApproved: Slta Waiver
SME-Granted: SME Approvals Granted
Tested-by: Jira Key
Reviewed-by: Huosheng Liao <liaohs@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
chailu1 2021-11-13 20:00:35 +08:00 • committed by Haijian Ma
commit bf8776fd3d
3 changed files with 55 additions and 17 deletions

View file

@ -57,7 +57,7 @@ static ssize_t pdo_info_show(struct device *dev,
cap.pwr_limit[i] = 0;
}
adapter_dev_get_cap(adapter_dev, MMI_PD, &cap);
adapter_dev_get_cap(adapter_dev, MMI_PD_ALL, &cap);
for (i = 0; i < cap.nr; i++) {
pr_err("%d: mV:%d,%d mA:%d type:%d\n", i,
cap.max_mv[i], cap.min_mv[i], cap.ma[i], cap.type[i]);
@ -125,8 +125,8 @@ static ssize_t pdo_test_show(struct device *dev,
pr_err("*** Error : can't find PD adapter ***\n");
ret = adapter_dev_set_cap(adapter_dev, MMI_PD,
9000, 3000);
ret = adapter_dev_set_cap(adapter_dev, MMI_PD_FIXED,
1, 9000, 3000);
if (ret == MMI_ADAPTER_OK)
return snprintf(buf, 40, "select pdo to 9v3a mode ok\n");
else
@ -147,7 +147,7 @@ static ssize_t apdo_test_show(struct device *dev,
else
pr_err("*** Error : can't find PD adapter ***\n");
ret = adapter_dev_set_cap(adapter_dev, MMI_PD_APDO_START, vol, 3000);
ret = adapter_dev_set_cap(adapter_dev, MMI_PD_APDO_START, 3, vol, 3000);
if (ret == MMI_ADAPTER_REJECT)
return snprintf(buf, 40, "start apdo reject\n");
else if (ret != 0)
@ -155,12 +155,12 @@ static ssize_t apdo_test_show(struct device *dev,
while (vol <10000) {
adapter_dev_set_cap(adapter_dev, MMI_PD_APDO,
vol, 3000);
3, vol, 3000);
vol += 200;
msleep(200);
}
ret = adapter_dev_set_cap(adapter_dev, MMI_PD_APDO_END, vol, 3000);
ret = adapter_dev_set_cap(adapter_dev, MMI_PD_APDO_END, 3, vol, 3000);
if (ret == MMI_ADAPTER_REJECT)
return snprintf(buf, 40, "stop apdo reject\n");
else if (ret != 0)
@ -210,12 +210,12 @@ int adapter_dev_get_output(struct adapter_device *adapter_dev, int *mV, int *mA)
EXPORT_SYMBOL(adapter_dev_get_output);
int adapter_dev_set_cap(struct adapter_device *adapter_dev,
enum adapter_cap_type type,
enum adapter_cap_type type, int pdo_idx,
int mV, int mA)
{
if (adapter_dev != NULL && adapter_dev->ops != NULL &&
adapter_dev->ops->set_cap)
return adapter_dev->ops->set_cap(adapter_dev, type, mV, mA);
return adapter_dev->ops->set_cap(adapter_dev, type, pdo_idx, mV, mA);
return -ENOTSUPP;
}

View file

@ -60,7 +60,7 @@ static int pd_get_property(struct adapter_device *dev,
}
static int pd_set_cap(struct adapter_device *dev, enum adapter_cap_type type,
int mV, int mA)
int pdo_idx, int mV, int mA)
{
int ret = MMI_ADAPTER_OK;
int tcpm_ret = TCPM_SUCCESS;
@ -69,7 +69,7 @@ static int pd_set_cap(struct adapter_device *dev, enum adapter_cap_type type,
pr_notice("[%s] type:%d mV:%d mA:%d\n",
__func__, type, mV, mA);
pdo_idx = 0;
info = (struct mmi_pd_adapter_info *)adapter_dev_get_drvdata(dev);
if (info == NULL || info->tcpc == NULL) {
pr_notice("[%s] info null\n", __func__);
@ -83,7 +83,7 @@ static int pd_set_cap(struct adapter_device *dev, enum adapter_cap_type type,
tcpm_ret = tcpm_reset_pd_charging_policy(info->tcpc, NULL);
} else if (type == MMI_PD_APDO) {
tcpm_ret = tcpm_dpm_pd_request(info->tcpc, mV, mA, NULL);
} else if (type == MMI_PD) {
} else if (type == MMI_PD_FIXED) {
tcpm_ret = tcpm_dpm_pd_request(info->tcpc, mV,
mA, NULL);
}
@ -230,7 +230,7 @@ static int pd_get_cap(struct adapter_device *dev,
if (cap_i == 0)
pr_notice("no APDO for pps\n");
} else if (type == MMI_PD) {
} else if (type == MMI_PD_FIXED) {
pd_cap.nr = 0;
pd_cap.selected_cap_idx = 0;
tcpm_get_remote_power_cap(info->tcpc, &pd_cap);
@ -244,10 +244,10 @@ static int pd_get_cap(struct adapter_device *dev,
j = 0;
pr_notice("adapter cap: nr:%d\n", pd_cap.nr);
for (i = 0; i < pd_cap.nr; i++) {
if (pd_cap.type[i] == 0 &&
if (pd_cap.type[i] == TCPM_POWER_CAP_VAL_TYPE_FIXED &&
j >= 0 &&
j < ADAPTER_CAP_MAX_NR) {
tacap->type[j] = MMI_PD;
tacap->type[j] = MMI_PD_FIXED;
tacap->ma[j] = pd_cap.ma[i];
tacap->max_mv[j] = pd_cap.max_mv[i];
tacap->min_mv[j] = pd_cap.min_mv[i];
@ -274,6 +274,38 @@ static int pd_get_cap(struct adapter_device *dev,
tacap->type[i], tacap->type[i]);
}
}
} else if (type == MMI_PD_ALL) {
pd_cap.nr = 0;
pd_cap.selected_cap_idx = 0;
tcpm_get_remote_power_cap(info->tcpc, &pd_cap);
tacap->nr = pd_cap.nr;
if (pd_cap.nr != 0) {
tacap->selected_cap_idx = pd_cap.selected_cap_idx - 1;
pr_notice("[%s] nr:%d idx:%d\n",
__func__, pd_cap.nr, pd_cap.selected_cap_idx - 1);
for (i = 0; i < pd_cap.nr; i++) {
tacap->ma[i] = pd_cap.ma[i];
tacap->max_mv[i] = pd_cap.max_mv[i];
tacap->min_mv[i] = pd_cap.min_mv[i];
tacap->maxwatt[i] =
tacap->max_mv[i] * tacap->ma[i];
if (pd_cap.type[i] == TCPM_POWER_CAP_VAL_TYPE_FIXED)
tacap->type[i] = MMI_PD_FIXED;
else if (pd_cap.type[i] == TCPM_POWER_CAP_VAL_TYPE_AUGMENT)
tacap->type[i] = MMI_PD_APDO;
else
tacap->type[i] = MMI_CAP_TYPE_UNKNOWN;
pr_notice("[%s]:%d mv:[%d,%d] %d max:%d min:%d type:%d %d\n",
__func__, i, tacap->min_mv[i],
tacap->max_mv[i], tacap->ma[i],
tacap->maxwatt[i], tacap->minwatt[i],
tacap->type[i], pd_cap.type[i]);
}
}
}
return MMI_ADAPTER_OK;

View file

@ -55,10 +55,16 @@ enum adapter_property {
};
enum adapter_cap_type {
/*start pd30 apdo*/
MMI_PD_APDO_START,
/*end pd30 apdo*/
MMI_PD_APDO_END,
MMI_PD,
/*pd30 apdo*/
MMI_PD_APDO,
/*pd20 fixed pdo*/
MMI_PD_FIXED,
/*all pdo: pd20&pd30*/
MMI_PD_ALL,
MMI_CAP_TYPE_UNKNOWN,
};
@ -101,7 +107,7 @@ struct adapter_ops {
int (*get_status)(struct adapter_device *dev,
struct adapter_status *sta);
int (*set_cap)(struct adapter_device *dev, enum adapter_cap_type type,
int mV, int mA);
int pdo_idx, int mV, int mA);
int (*get_cap)(struct adapter_device *dev, enum adapter_cap_type type,
struct adapter_power_cap *cap);
int (*get_output)(struct adapter_device *dev, int *mV, int *mA);
@ -143,7 +149,7 @@ extern int adapter_dev_get_status(struct adapter_device *adapter_dev,
extern int adapter_dev_get_output(struct adapter_device *adapter_dev,
int *mV, int *mA);
extern int adapter_dev_set_cap(struct adapter_device *adapter_dev,
enum adapter_cap_type type,
enum adapter_cap_type type, int pdo_idx,
int mV, int mA);
extern int adapter_dev_get_cap(struct adapter_device *adapter_dev,
enum adapter_cap_type type,