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 <[email protected]>
CC: Guenter Roeck <[email protected]>
CC: Heikki Krogerus <[email protected]>
CC: Adam Thomson <[email protected]>
CC: Badhri Jagan Sridharan <[email protected]>
Signed-off-by: Li Jun <[email protected]>
---
 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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to