This patch tries to fix the problem describled on revert patch commit[1], suppose any supported voltage ranges of sink should be describled by variable pdo, so instead of revert the patch of only comparing source and sink pdo to select one source pdo, this patch adds the match between source fixed pdo and sink variable pdo. [1] https://www.spinics.net/lists/linux-usb/msg166366.html CC: Hans de Goede <hdegoede@xxxxxxxxxx> CC: Guenter Roeck <linux@xxxxxxxxxxxx> CC: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx> CC: Adam Thomson <Adam.Thomson.Opensource@xxxxxxxxxxx> CC: Badhri Jagan Sridharan <Badhri@xxxxxxxxxx> Signed-off-by: Li Jun <jun.li@xxxxxxx> --- drivers/usb/typec/tcpm.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c index ef3a60d..8a74a43 100644 --- a/drivers/usb/typec/tcpm.c +++ b/drivers/usb/typec/tcpm.c @@ -1815,6 +1815,37 @@ static int tcpm_pd_select_pdo(struct tcpm_port *port, int *sink_pdo, break; } } + + /* + * If the source pdo has the same voltage with one + * fixed pdo, no need check variable pdo for it. + */ + if (j < port->nr_fixed) + continue; + + for (j = port->nr_fixed + + port->nr_batt; + j < port->nr_fixed + + port->nr_batt + + port->nr_var; + j++) { + if (pdo_fixed_voltage(pdo) >= + pdo_min_voltage(port->snk_pdo[j]) && + pdo_fixed_voltage(pdo) <= + pdo_max_voltage(port->snk_pdo[j])) { + ma = min_current(pdo, port->snk_pdo[j]); + mv = pdo_fixed_voltage(pdo); + mw = ma * mv / 1000; + if (mw > max_mw || + (mw == max_mw && mv > max_mv)) { + ret = 0; + *src_pdo = i; + *sink_pdo = j; + max_mw = mw; + max_mv = mv; + } + } + } } else if (type == PDO_TYPE_BATT) { for (j = port->nr_fixed; j < port->nr_fixed + -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html