diff --git a/drivers/usb/typec/adapter_class/adapter_class.c b/drivers/usb/typec/adapter_class/adapter_class.c index 756134ed9ee3..133040f1c2f6 100644 --- a/drivers/usb/typec/adapter_class/adapter_class.c +++ b/drivers/usb/typec/adapter_class/adapter_class.c @@ -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; } diff --git a/drivers/usb/typec/mmi_tcpc/pd_adapter.c b/drivers/usb/typec/mmi_tcpc/pd_adapter.c index acc574ecd9af..0946ddc57768 100644 --- a/drivers/usb/typec/mmi_tcpc/pd_adapter.c +++ b/drivers/usb/typec/mmi_tcpc/pd_adapter.c @@ -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; diff --git a/include/linux/usb/adapter_class.h b/include/linux/usb/adapter_class.h index e93859bada4f..f866cca8de8a 100644 --- a/include/linux/usb/adapter_class.h +++ b/include/linux/usb/adapter_class.h @@ -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,