usb: typec: tcpm: add get max power support
authorFrank Wang <frank.wang@rock-chips.com>
Fri, 16 Jun 2023 07:52:41 +0000 (15:52 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 19 Jun 2023 13:34:35 +0000 (15:34 +0200)
Traverse fixed pdos to calculate the maximum power that the charger
can provide, and it can be get by POWER_SUPPLY_PROP_INPUT_POWER_LIMIT
property.

Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20230616075241.27690-2-frank.wang@rock-chips.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/tcpm/tcpm.c

index 9f6aaa3..829d75e 100644 (file)
@@ -6340,6 +6340,27 @@ static int tcpm_psy_get_current_now(struct tcpm_port *port,
        return 0;
 }
 
+static int tcpm_psy_get_input_power_limit(struct tcpm_port *port,
+                                         union power_supply_propval *val)
+{
+       unsigned int src_mv, src_ma, max_src_uw = 0;
+       unsigned int i, tmp;
+
+       for (i = 0; i < port->nr_source_caps; i++) {
+               u32 pdo = port->source_caps[i];
+
+               if (pdo_type(pdo) == PDO_TYPE_FIXED) {
+                       src_mv = pdo_fixed_voltage(pdo);
+                       src_ma = pdo_max_current(pdo);
+                       tmp = src_mv * src_ma;
+                       max_src_uw = tmp > max_src_uw ? tmp : max_src_uw;
+               }
+       }
+
+       val->intval = max_src_uw;
+       return 0;
+}
+
 static int tcpm_psy_get_prop(struct power_supply *psy,
                             enum power_supply_property psp,
                             union power_supply_propval *val)
@@ -6369,6 +6390,9 @@ static int tcpm_psy_get_prop(struct power_supply *psy,
        case POWER_SUPPLY_PROP_CURRENT_NOW:
                ret = tcpm_psy_get_current_now(port, val);
                break;
+       case POWER_SUPPLY_PROP_INPUT_POWER_LIMIT:
+               tcpm_psy_get_input_power_limit(port, val);
+               break;
        default:
                ret = -EINVAL;
                break;