Loading drivers/power/supply/power_supply_sysfs.c +8 −0 Original line number Diff line number Diff line Loading @@ -89,6 +89,10 @@ static const char * const power_supply_usbc_pr_text[] = { "none", "dual power role", "sink", "source" }; static const char * const power_supply_typec_src_rp_text[] = { "Rp-Default", "Rp-1.5A", "Rp-3A" }; static ssize_t power_supply_show_property(struct device *dev, struct device_attribute *attr, char *buf) { Loading Loading @@ -141,6 +145,9 @@ static ssize_t power_supply_show_property(struct device *dev, else if (off == POWER_SUPPLY_PROP_TYPEC_POWER_ROLE) return scnprintf(buf, PAGE_SIZE, "%s\n", power_supply_usbc_pr_text[value.intval]); else if (off == POWER_SUPPLY_PROP_TYPEC_SRC_RP) return scnprintf(buf, PAGE_SIZE, "%s\n", power_supply_typec_src_rp_text[value.intval]); else if (off == POWER_SUPPLY_PROP_DIE_HEALTH) return scnprintf(buf, PAGE_SIZE, "%s\n", power_supply_health_text[value.intval]); Loading Loading @@ -334,6 +341,7 @@ static struct device_attribute power_supply_attrs[] = { POWER_SUPPLY_ATTR(typec_mode), POWER_SUPPLY_ATTR(typec_cc_orientation), POWER_SUPPLY_ATTR(typec_power_role), POWER_SUPPLY_ATTR(typec_src_rp), POWER_SUPPLY_ATTR(pd_allowed), POWER_SUPPLY_ATTR(pd_active), POWER_SUPPLY_ATTR(pd_in_hard_reset), Loading drivers/power/supply/qcom/qpnp-smb5.c +8 −1 Original line number Diff line number Diff line Loading @@ -498,6 +498,7 @@ static enum power_supply_property smb5_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_ACTIVE, POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED, POWER_SUPPLY_PROP_INPUT_CURRENT_NOW, Loading Loading @@ -581,6 +582,9 @@ static int smb5_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_ACTIVE: val->intval = chg->pd_active; break; Loading Loading @@ -671,6 +675,9 @@ static int smb5_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 Loading @@ -1932,7 +1939,7 @@ static int smb5_init_hw(struct smb5 *chip) } } /* set the Source Mode (OTG) current limit */ /* set the Source (OTG) mode current limit */ rc = smblib_masked_write(chg, DCDC_OTG_CURRENT_LIMIT_CFG_REG, OTG_CURRENT_LIMIT_MASK, OTG_CURRENT_LIMIT_3000_MA); if (rc < 0) { Loading drivers/power/supply/qcom/smb5-lib.c +65 −0 Original line number Diff line number Diff line Loading @@ -2272,6 +2272,48 @@ int smblib_get_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_CURRSRC_CFG_REG, &stat); if (rc < 0) { smblib_err(chg, "Couldn't read TYPE_C_CURRSRC_CFG_REG rc=%d\n", rc); return rc; } switch (stat & TYPEC_SRC_RP_SEL_MASK) { 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; case TYPEC_SRC_RP_3A: case TYPEC_SRC_RP_3A_DUPLICATE: rp = POWER_SUPPLY_TYPEC_SRC_RP_3A; break; default: return -EINVAL; } val->intval = rp; return 0; } int smblib_get_prop_usb_current_now(struct smb_charger *chg, union power_supply_propval *val) { Loading Loading @@ -2609,6 +2651,29 @@ int smblib_set_prop_typec_power_role(struct smb_charger *chg, return rc; } int smblib_set_prop_typec_select_rp(struct smb_charger *chg, const union power_supply_propval *val) { int rc; if (!typec_in_src_mode(chg)) { smblib_err(chg, "Couldn't set curr src: not in SRC mode\n"); return -EINVAL; } if (val->intval < TYPEC_SRC_RP_MAX_ELEMENTS) { rc = smblib_masked_write(chg, TYPE_C_CURRSRC_CFG_REG, TYPEC_SRC_RP_SEL_MASK, val->intval); if (rc < 0) smblib_err(chg, "Couldn't write to TYPE_C_CURRSRC_CFG rc=%d\n", rc); return rc; } return -EINVAL; } int smblib_set_prop_pd_voltage_min(struct smb_charger *chg, const union power_supply_propval *val) { Loading drivers/power/supply/qcom/smb5-lib.h +4 −0 Original line number Diff line number Diff line Loading @@ -506,6 +506,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_input_current_settled(struct smb_charger *chg, Loading @@ -531,6 +533,8 @@ int smblib_set_prop_pd_voltage_min(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/smb5-reg.h +10 −0 Original line number Diff line number Diff line Loading @@ -340,6 +340,16 @@ enum { #define BYPASS_VSAFE0V_DURING_ROLE_SWAP_BIT BIT(3) #define EXIT_SNK_BASED_ON_CC_BIT BIT(0) #define TYPE_C_CURRSRC_CFG_REG (TYPEC_BASE + 0x52) #define TYPEC_SRC_RP_SEL_MASK GENMASK(1, 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_INTERRUPT_EN_CFG_1_REG (TYPEC_BASE + 0x5E) #define TYPEC_LEGACY_CABLE_INT_EN_BIT BIT(7) #define TYPEC_NONCOMPLIANT_LEGACY_CABLE_INT_EN_BIT BIT(6) Loading Loading
drivers/power/supply/power_supply_sysfs.c +8 −0 Original line number Diff line number Diff line Loading @@ -89,6 +89,10 @@ static const char * const power_supply_usbc_pr_text[] = { "none", "dual power role", "sink", "source" }; static const char * const power_supply_typec_src_rp_text[] = { "Rp-Default", "Rp-1.5A", "Rp-3A" }; static ssize_t power_supply_show_property(struct device *dev, struct device_attribute *attr, char *buf) { Loading Loading @@ -141,6 +145,9 @@ static ssize_t power_supply_show_property(struct device *dev, else if (off == POWER_SUPPLY_PROP_TYPEC_POWER_ROLE) return scnprintf(buf, PAGE_SIZE, "%s\n", power_supply_usbc_pr_text[value.intval]); else if (off == POWER_SUPPLY_PROP_TYPEC_SRC_RP) return scnprintf(buf, PAGE_SIZE, "%s\n", power_supply_typec_src_rp_text[value.intval]); else if (off == POWER_SUPPLY_PROP_DIE_HEALTH) return scnprintf(buf, PAGE_SIZE, "%s\n", power_supply_health_text[value.intval]); Loading Loading @@ -334,6 +341,7 @@ static struct device_attribute power_supply_attrs[] = { POWER_SUPPLY_ATTR(typec_mode), POWER_SUPPLY_ATTR(typec_cc_orientation), POWER_SUPPLY_ATTR(typec_power_role), POWER_SUPPLY_ATTR(typec_src_rp), POWER_SUPPLY_ATTR(pd_allowed), POWER_SUPPLY_ATTR(pd_active), POWER_SUPPLY_ATTR(pd_in_hard_reset), Loading
drivers/power/supply/qcom/qpnp-smb5.c +8 −1 Original line number Diff line number Diff line Loading @@ -498,6 +498,7 @@ static enum power_supply_property smb5_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_ACTIVE, POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED, POWER_SUPPLY_PROP_INPUT_CURRENT_NOW, Loading Loading @@ -581,6 +582,9 @@ static int smb5_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_ACTIVE: val->intval = chg->pd_active; break; Loading Loading @@ -671,6 +675,9 @@ static int smb5_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 Loading @@ -1932,7 +1939,7 @@ static int smb5_init_hw(struct smb5 *chip) } } /* set the Source Mode (OTG) current limit */ /* set the Source (OTG) mode current limit */ rc = smblib_masked_write(chg, DCDC_OTG_CURRENT_LIMIT_CFG_REG, OTG_CURRENT_LIMIT_MASK, OTG_CURRENT_LIMIT_3000_MA); if (rc < 0) { Loading
drivers/power/supply/qcom/smb5-lib.c +65 −0 Original line number Diff line number Diff line Loading @@ -2272,6 +2272,48 @@ int smblib_get_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_CURRSRC_CFG_REG, &stat); if (rc < 0) { smblib_err(chg, "Couldn't read TYPE_C_CURRSRC_CFG_REG rc=%d\n", rc); return rc; } switch (stat & TYPEC_SRC_RP_SEL_MASK) { 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; case TYPEC_SRC_RP_3A: case TYPEC_SRC_RP_3A_DUPLICATE: rp = POWER_SUPPLY_TYPEC_SRC_RP_3A; break; default: return -EINVAL; } val->intval = rp; return 0; } int smblib_get_prop_usb_current_now(struct smb_charger *chg, union power_supply_propval *val) { Loading Loading @@ -2609,6 +2651,29 @@ int smblib_set_prop_typec_power_role(struct smb_charger *chg, return rc; } int smblib_set_prop_typec_select_rp(struct smb_charger *chg, const union power_supply_propval *val) { int rc; if (!typec_in_src_mode(chg)) { smblib_err(chg, "Couldn't set curr src: not in SRC mode\n"); return -EINVAL; } if (val->intval < TYPEC_SRC_RP_MAX_ELEMENTS) { rc = smblib_masked_write(chg, TYPE_C_CURRSRC_CFG_REG, TYPEC_SRC_RP_SEL_MASK, val->intval); if (rc < 0) smblib_err(chg, "Couldn't write to TYPE_C_CURRSRC_CFG rc=%d\n", rc); return rc; } return -EINVAL; } int smblib_set_prop_pd_voltage_min(struct smb_charger *chg, const union power_supply_propval *val) { Loading
drivers/power/supply/qcom/smb5-lib.h +4 −0 Original line number Diff line number Diff line Loading @@ -506,6 +506,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_input_current_settled(struct smb_charger *chg, Loading @@ -531,6 +533,8 @@ int smblib_set_prop_pd_voltage_min(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/smb5-reg.h +10 −0 Original line number Diff line number Diff line Loading @@ -340,6 +340,16 @@ enum { #define BYPASS_VSAFE0V_DURING_ROLE_SWAP_BIT BIT(3) #define EXIT_SNK_BASED_ON_CC_BIT BIT(0) #define TYPE_C_CURRSRC_CFG_REG (TYPEC_BASE + 0x52) #define TYPEC_SRC_RP_SEL_MASK GENMASK(1, 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_INTERRUPT_EN_CFG_1_REG (TYPEC_BASE + 0x5E) #define TYPEC_LEGACY_CABLE_INT_EN_BIT BIT(7) #define TYPEC_NONCOMPLIANT_LEGACY_CABLE_INT_EN_BIT BIT(6) Loading