Loading drivers/power/supply/qcom/qpnp-smb2.c +7 −0 Original line number Diff line number Diff line Loading @@ -413,6 +413,7 @@ static enum power_supply_property smb2_usb_props[] = { POWER_SUPPLY_PROP_TYPEC_MODE, POWER_SUPPLY_PROP_TYPEC_POWER_ROLE, POWER_SUPPLY_PROP_TYPEC_CC_ORIENTATION, POWER_SUPPLY_PROP_TYPEC_SRC_RP, POWER_SUPPLY_PROP_PD_ALLOWED, POWER_SUPPLY_PROP_PD_ACTIVE, POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED, Loading Loading @@ -503,6 +504,9 @@ static int smb2_usb_get_prop(struct power_supply *psy, else rc = smblib_get_prop_typec_cc_orientation(chg, val); break; case POWER_SUPPLY_PROP_TYPEC_SRC_RP: rc = smblib_get_prop_typec_select_rp(chg, val); break; case POWER_SUPPLY_PROP_PD_ALLOWED: rc = smblib_get_prop_pd_allowed(chg, val); break; Loading Loading @@ -595,6 +599,9 @@ static int smb2_usb_set_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_TYPEC_POWER_ROLE: rc = smblib_set_prop_typec_power_role(chg, val); break; case POWER_SUPPLY_PROP_TYPEC_SRC_RP: rc = smblib_set_prop_typec_select_rp(chg, val); break; case POWER_SUPPLY_PROP_PD_ACTIVE: rc = smblib_set_prop_pd_active(chg, val); break; Loading drivers/power/supply/qcom/smb-lib.c +74 −0 Original line number Diff line number Diff line Loading @@ -1187,6 +1187,44 @@ static int __smblib_set_prop_typec_power_role(struct smb_charger *chg, return rc; } static inline bool typec_in_src_mode(struct smb_charger *chg) { return (chg->typec_mode > POWER_SUPPLY_TYPEC_NONE && chg->typec_mode < POWER_SUPPLY_TYPEC_SOURCE_DEFAULT); } int smblib_get_prop_typec_select_rp(struct smb_charger *chg, union power_supply_propval *val) { int rc, rp; u8 stat; if (!typec_in_src_mode(chg)) return -ENODATA; rc = smblib_read(chg, TYPE_C_CFG_2_REG, &stat); if (rc < 0) { smblib_err(chg, "Couldn't read TYPE_C_CURRSRC_CFG_REG rc=%d\n", rc); return rc; } switch (stat & EN_80UA_180UA_CUR_SOURCE_BIT) { case TYPEC_SRC_RP_STD: rp = POWER_SUPPLY_TYPEC_SRC_RP_STD; break; case TYPEC_SRC_RP_1P5A: rp = POWER_SUPPLY_TYPEC_SRC_RP_1P5A; break; default: return -EINVAL; } val->intval = rp; return 0; } /********************* * VOTABLE CALLBACKS * *********************/ Loading Loading @@ -2881,6 +2919,42 @@ int smblib_set_prop_typec_power_role(struct smb_charger *chg, return 0; } int smblib_set_prop_typec_select_rp(struct smb_charger *chg, const union power_supply_propval *val) { int rc = 0; if (!typec_in_src_mode(chg)) { smblib_err(chg, "Couldn't set curr src: not in SRC mode\n"); return -EINVAL; } if (val->intval < 0 || val->intval >= TYPEC_SRC_RP_MAX_ELEMENTS) return -EINVAL; switch (val->intval) { case TYPEC_SRC_RP_STD: rc = smblib_masked_write(chg, TYPE_C_CFG_2_REG, EN_80UA_180UA_CUR_SOURCE_BIT, TYPEC_SRC_RP_STD); break; case TYPEC_SRC_RP_1P5A: case TYPEC_SRC_RP_3A: case TYPEC_SRC_RP_3A_DUPLICATE: rc = smblib_masked_write(chg, TYPE_C_CFG_2_REG, EN_80UA_180UA_CUR_SOURCE_BIT, TYPEC_SRC_RP_1P5A); break; default: return -EINVAL; } if (rc < 0) smblib_err(chg, "Couldn't write to TYPE_C_CURRSRC_CFG rc=%d\n", rc); return rc; } int smblib_set_prop_pd_voltage_min(struct smb_charger *chg, const union power_supply_propval *val) { Loading drivers/power/supply/qcom/smb-lib.h +4 −0 Original line number Diff line number Diff line Loading @@ -483,6 +483,8 @@ int smblib_get_prop_usb_current_now(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_typec_cc_orientation(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_typec_select_rp(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_typec_power_role(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_pd_allowed(struct smb_charger *chg, Loading Loading @@ -515,6 +517,8 @@ int smblib_set_prop_boost_current(struct smb_charger *chg, const union power_supply_propval *val); int smblib_set_prop_typec_power_role(struct smb_charger *chg, const union power_supply_propval *val); int smblib_set_prop_typec_select_rp(struct smb_charger *chg, const union power_supply_propval *val); int smblib_set_prop_pd_active(struct smb_charger *chg, const union power_supply_propval *val); int smblib_set_prop_pd_in_hard_reset(struct smb_charger *chg, Loading drivers/power/supply/qcom/smb-reg.h +7 −0 Original line number Diff line number Diff line Loading @@ -568,6 +568,13 @@ enum { #define USB_FACTORY_MODE_ENABLE_BIT BIT(2) #define TYPE_C_UFP_MODE_BIT BIT(1) #define EN_80UA_180UA_CUR_SOURCE_BIT BIT(0) enum { TYPEC_SRC_RP_STD, TYPEC_SRC_RP_1P5A, TYPEC_SRC_RP_3A, TYPEC_SRC_RP_3A_DUPLICATE, TYPEC_SRC_RP_MAX_ELEMENTS }; #define TYPE_C_CFG_3_REG (USBIN_BASE + 0x5A) #define TVBUS_DEBOUNCE_BIT BIT(7) Loading Loading
drivers/power/supply/qcom/qpnp-smb2.c +7 −0 Original line number Diff line number Diff line Loading @@ -413,6 +413,7 @@ static enum power_supply_property smb2_usb_props[] = { POWER_SUPPLY_PROP_TYPEC_MODE, POWER_SUPPLY_PROP_TYPEC_POWER_ROLE, POWER_SUPPLY_PROP_TYPEC_CC_ORIENTATION, POWER_SUPPLY_PROP_TYPEC_SRC_RP, POWER_SUPPLY_PROP_PD_ALLOWED, POWER_SUPPLY_PROP_PD_ACTIVE, POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED, Loading Loading @@ -503,6 +504,9 @@ static int smb2_usb_get_prop(struct power_supply *psy, else rc = smblib_get_prop_typec_cc_orientation(chg, val); break; case POWER_SUPPLY_PROP_TYPEC_SRC_RP: rc = smblib_get_prop_typec_select_rp(chg, val); break; case POWER_SUPPLY_PROP_PD_ALLOWED: rc = smblib_get_prop_pd_allowed(chg, val); break; Loading Loading @@ -595,6 +599,9 @@ static int smb2_usb_set_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_TYPEC_POWER_ROLE: rc = smblib_set_prop_typec_power_role(chg, val); break; case POWER_SUPPLY_PROP_TYPEC_SRC_RP: rc = smblib_set_prop_typec_select_rp(chg, val); break; case POWER_SUPPLY_PROP_PD_ACTIVE: rc = smblib_set_prop_pd_active(chg, val); break; Loading
drivers/power/supply/qcom/smb-lib.c +74 −0 Original line number Diff line number Diff line Loading @@ -1187,6 +1187,44 @@ static int __smblib_set_prop_typec_power_role(struct smb_charger *chg, return rc; } static inline bool typec_in_src_mode(struct smb_charger *chg) { return (chg->typec_mode > POWER_SUPPLY_TYPEC_NONE && chg->typec_mode < POWER_SUPPLY_TYPEC_SOURCE_DEFAULT); } int smblib_get_prop_typec_select_rp(struct smb_charger *chg, union power_supply_propval *val) { int rc, rp; u8 stat; if (!typec_in_src_mode(chg)) return -ENODATA; rc = smblib_read(chg, TYPE_C_CFG_2_REG, &stat); if (rc < 0) { smblib_err(chg, "Couldn't read TYPE_C_CURRSRC_CFG_REG rc=%d\n", rc); return rc; } switch (stat & EN_80UA_180UA_CUR_SOURCE_BIT) { case TYPEC_SRC_RP_STD: rp = POWER_SUPPLY_TYPEC_SRC_RP_STD; break; case TYPEC_SRC_RP_1P5A: rp = POWER_SUPPLY_TYPEC_SRC_RP_1P5A; break; default: return -EINVAL; } val->intval = rp; return 0; } /********************* * VOTABLE CALLBACKS * *********************/ Loading Loading @@ -2881,6 +2919,42 @@ int smblib_set_prop_typec_power_role(struct smb_charger *chg, return 0; } int smblib_set_prop_typec_select_rp(struct smb_charger *chg, const union power_supply_propval *val) { int rc = 0; if (!typec_in_src_mode(chg)) { smblib_err(chg, "Couldn't set curr src: not in SRC mode\n"); return -EINVAL; } if (val->intval < 0 || val->intval >= TYPEC_SRC_RP_MAX_ELEMENTS) return -EINVAL; switch (val->intval) { case TYPEC_SRC_RP_STD: rc = smblib_masked_write(chg, TYPE_C_CFG_2_REG, EN_80UA_180UA_CUR_SOURCE_BIT, TYPEC_SRC_RP_STD); break; case TYPEC_SRC_RP_1P5A: case TYPEC_SRC_RP_3A: case TYPEC_SRC_RP_3A_DUPLICATE: rc = smblib_masked_write(chg, TYPE_C_CFG_2_REG, EN_80UA_180UA_CUR_SOURCE_BIT, TYPEC_SRC_RP_1P5A); break; default: return -EINVAL; } if (rc < 0) smblib_err(chg, "Couldn't write to TYPE_C_CURRSRC_CFG rc=%d\n", rc); return rc; } int smblib_set_prop_pd_voltage_min(struct smb_charger *chg, const union power_supply_propval *val) { Loading
drivers/power/supply/qcom/smb-lib.h +4 −0 Original line number Diff line number Diff line Loading @@ -483,6 +483,8 @@ int smblib_get_prop_usb_current_now(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_typec_cc_orientation(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_typec_select_rp(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_typec_power_role(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_pd_allowed(struct smb_charger *chg, Loading Loading @@ -515,6 +517,8 @@ int smblib_set_prop_boost_current(struct smb_charger *chg, const union power_supply_propval *val); int smblib_set_prop_typec_power_role(struct smb_charger *chg, const union power_supply_propval *val); int smblib_set_prop_typec_select_rp(struct smb_charger *chg, const union power_supply_propval *val); int smblib_set_prop_pd_active(struct smb_charger *chg, const union power_supply_propval *val); int smblib_set_prop_pd_in_hard_reset(struct smb_charger *chg, Loading
drivers/power/supply/qcom/smb-reg.h +7 −0 Original line number Diff line number Diff line Loading @@ -568,6 +568,13 @@ enum { #define USB_FACTORY_MODE_ENABLE_BIT BIT(2) #define TYPE_C_UFP_MODE_BIT BIT(1) #define EN_80UA_180UA_CUR_SOURCE_BIT BIT(0) enum { TYPEC_SRC_RP_STD, TYPEC_SRC_RP_1P5A, TYPEC_SRC_RP_3A, TYPEC_SRC_RP_3A_DUPLICATE, TYPEC_SRC_RP_MAX_ELEMENTS }; #define TYPE_C_CFG_3_REG (USBIN_BASE + 0x5A) #define TVBUS_DEBOUNCE_BIT BIT(7) Loading