Loading drivers/power/supply/qcom/qpnp-smb5.c +27 −15 Original line number Diff line number Diff line Loading @@ -1267,7 +1267,7 @@ static int smb5_batt_get_prop(struct power_supply *psy, break; case POWER_SUPPLY_PROP_DIE_HEALTH: if (chg->die_health == -EINVAL) rc = smblib_get_prop_die_health(chg, val); val->intval = smblib_get_prop_die_health(chg); else val->intval = chg->die_health; break; Loading Loading @@ -1599,6 +1599,8 @@ static int smb5_configure_micro_usb(struct smb_charger *chg) { int rc; /* For micro USB connector, use extcon by default */ chg->use_extcon = true; chg->pd_not_supported = true; rc = smblib_masked_write(chg, TYPE_C_INTERRUPT_EN_CFG_2_REG, Loading Loading @@ -2640,20 +2642,6 @@ static int smb5_probe(struct platform_device *pdev) /* set driver data before resources request it */ platform_set_drvdata(pdev, chip); rc = smb5_init_vbus_regulator(chip); if (rc < 0) { pr_err("Couldn't initialize vbus regulator rc=%d\n", rc); goto cleanup; } rc = smb5_init_vconn_regulator(chip); if (rc < 0) { pr_err("Couldn't initialize vconn regulator rc=%d\n", rc); goto cleanup; } /* extcon registration */ chg->extcon = devm_extcon_dev_allocate(chg->dev, smblib_extcon_cable); if (IS_ERR(chg->extcon)) { Loading @@ -2676,6 +2664,30 @@ static int smb5_probe(struct platform_device *pdev) goto cleanup; } /* * VBUS regulator enablement/disablement for host mode is handled * by USB-PD driver only. For micro-USB and non-PD typeC designs, * the VBUS regulator is enabled/disabled by the smb driver itself * before sending extcon notifications. * Hence, register vbus and vconn regulators for PD supported designs * only. */ if (!chg->pd_not_supported) { rc = smb5_init_vbus_regulator(chip); if (rc < 0) { pr_err("Couldn't initialize vbus regulator rc=%d\n", rc); goto cleanup; } rc = smb5_init_vconn_regulator(chip); if (rc < 0) { pr_err("Couldn't initialize vconn regulator rc=%d\n", rc); goto cleanup; } } switch (chg->smb_version) { case PM8150B_SUBTYPE: case PM6150_SUBTYPE: Loading drivers/power/supply/qcom/smb5-lib.c +38 −27 Original line number Diff line number Diff line Loading @@ -224,8 +224,30 @@ static void smblib_notify_device_mode(struct smb_charger *chg, bool enable) static void smblib_notify_usb_host(struct smb_charger *chg, bool enable) { if (enable) int rc = 0; if (enable) { smblib_dbg(chg, PR_OTG, "enabling VBUS in OTG mode\n"); rc = smblib_masked_write(chg, DCDC_CMD_OTG_REG, OTG_EN_BIT, OTG_EN_BIT); if (rc < 0) { smblib_err(chg, "Couldn't enable VBUS in OTG mode rc=%d\n", rc); return; } smblib_notify_extcon_props(chg, EXTCON_USB_HOST); } else { smblib_dbg(chg, PR_OTG, "disabling VBUS in OTG mode\n"); rc = smblib_masked_write(chg, DCDC_CMD_OTG_REG, OTG_EN_BIT, 0); if (rc < 0) { smblib_err(chg, "Couldn't disable VBUS in OTG mode rc=%d\n", rc); return; } } extcon_set_state_sync(chg->extcon, EXTCON_USB_HOST, enable); } Loading Loading @@ -2641,38 +2663,28 @@ int smblib_get_pe_start(struct smb_charger *chg, return 0; } int smblib_get_prop_die_health(struct smb_charger *chg, union power_supply_propval *val) int smblib_get_prop_die_health(struct smb_charger *chg) { int rc; u8 stat; rc = smblib_read(chg, TEMP_RANGE_STATUS_REG, &stat); rc = smblib_read(chg, DIE_TEMP_STATUS_REG, &stat); if (rc < 0) { smblib_err(chg, "Couldn't read TEMP_RANGE_STATUS_REG rc=%d\n", smblib_err(chg, "Couldn't read DIE_TEMP_STATUS_REG, rc=%d\n", rc); return rc; return POWER_SUPPLY_HEALTH_UNKNOWN; } /* TEMP_RANGE bits are mutually exclusive */ switch (stat & TEMP_RANGE_MASK) { case TEMP_BELOW_RANGE_BIT: val->intval = POWER_SUPPLY_HEALTH_COOL; break; case TEMP_WITHIN_RANGE_BIT: val->intval = POWER_SUPPLY_HEALTH_WARM; break; case TEMP_ABOVE_RANGE_BIT: val->intval = POWER_SUPPLY_HEALTH_HOT; break; case ALERT_LEVEL_BIT: val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; break; default: val->intval = POWER_SUPPLY_HEALTH_UNKNOWN; } if (stat & DIE_TEMP_RST_BIT) return POWER_SUPPLY_HEALTH_OVERHEAT; return 0; if (stat & DIE_TEMP_UB_BIT) return POWER_SUPPLY_HEALTH_HOT; if (stat & DIE_TEMP_LB_BIT) return POWER_SUPPLY_HEALTH_WARM; return POWER_SUPPLY_HEALTH_COOL; } int smblib_get_prop_connector_health(struct smb_charger *chg) Loading Loading @@ -3684,8 +3696,7 @@ static void smblib_handle_apsd_done(struct smb_charger *chg, bool rising) case SDP_CHARGER_BIT: case CDP_CHARGER_BIT: case FLOAT_CHARGER_BIT: if ((chg->connector_type == POWER_SUPPLY_CONNECTOR_MICRO_USB) || chg->use_extcon) if (chg->use_extcon) smblib_notify_device_mode(chg, true); break; case OCP_CHARGER_BIT: Loading drivers/power/supply/qcom/smb5-lib.h +1 −2 Original line number Diff line number Diff line Loading @@ -557,8 +557,7 @@ int smblib_get_pe_start(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_charger_temp(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_die_health(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_die_health(struct smb_charger *chg); int smblib_get_prop_connector_health(struct smb_charger *chg); int smblib_set_prop_pd_current_max(struct smb_charger *chg, const union power_supply_propval *val); Loading drivers/power/supply/qcom/smb5-reg.h +6 −0 Original line number Diff line number Diff line Loading @@ -403,6 +403,12 @@ enum { #define TEMP_BELOW_RANGE_BIT BIT(1) #define THERMREG_DISABLED_BIT BIT(0) #define DIE_TEMP_STATUS_REG (MISC_BASE + 0x07) #define DIE_TEMP_SHDN_BIT BIT(3) #define DIE_TEMP_RST_BIT BIT(2) #define DIE_TEMP_UB_BIT BIT(1) #define DIE_TEMP_LB_BIT BIT(0) #define CONNECTOR_TEMP_STATUS_REG (MISC_BASE + 0x09) #define CONNECTOR_TEMP_SHDN_BIT BIT(3) #define CONNECTOR_TEMP_RST_BIT BIT(2) Loading Loading
drivers/power/supply/qcom/qpnp-smb5.c +27 −15 Original line number Diff line number Diff line Loading @@ -1267,7 +1267,7 @@ static int smb5_batt_get_prop(struct power_supply *psy, break; case POWER_SUPPLY_PROP_DIE_HEALTH: if (chg->die_health == -EINVAL) rc = smblib_get_prop_die_health(chg, val); val->intval = smblib_get_prop_die_health(chg); else val->intval = chg->die_health; break; Loading Loading @@ -1599,6 +1599,8 @@ static int smb5_configure_micro_usb(struct smb_charger *chg) { int rc; /* For micro USB connector, use extcon by default */ chg->use_extcon = true; chg->pd_not_supported = true; rc = smblib_masked_write(chg, TYPE_C_INTERRUPT_EN_CFG_2_REG, Loading Loading @@ -2640,20 +2642,6 @@ static int smb5_probe(struct platform_device *pdev) /* set driver data before resources request it */ platform_set_drvdata(pdev, chip); rc = smb5_init_vbus_regulator(chip); if (rc < 0) { pr_err("Couldn't initialize vbus regulator rc=%d\n", rc); goto cleanup; } rc = smb5_init_vconn_regulator(chip); if (rc < 0) { pr_err("Couldn't initialize vconn regulator rc=%d\n", rc); goto cleanup; } /* extcon registration */ chg->extcon = devm_extcon_dev_allocate(chg->dev, smblib_extcon_cable); if (IS_ERR(chg->extcon)) { Loading @@ -2676,6 +2664,30 @@ static int smb5_probe(struct platform_device *pdev) goto cleanup; } /* * VBUS regulator enablement/disablement for host mode is handled * by USB-PD driver only. For micro-USB and non-PD typeC designs, * the VBUS regulator is enabled/disabled by the smb driver itself * before sending extcon notifications. * Hence, register vbus and vconn regulators for PD supported designs * only. */ if (!chg->pd_not_supported) { rc = smb5_init_vbus_regulator(chip); if (rc < 0) { pr_err("Couldn't initialize vbus regulator rc=%d\n", rc); goto cleanup; } rc = smb5_init_vconn_regulator(chip); if (rc < 0) { pr_err("Couldn't initialize vconn regulator rc=%d\n", rc); goto cleanup; } } switch (chg->smb_version) { case PM8150B_SUBTYPE: case PM6150_SUBTYPE: Loading
drivers/power/supply/qcom/smb5-lib.c +38 −27 Original line number Diff line number Diff line Loading @@ -224,8 +224,30 @@ static void smblib_notify_device_mode(struct smb_charger *chg, bool enable) static void smblib_notify_usb_host(struct smb_charger *chg, bool enable) { if (enable) int rc = 0; if (enable) { smblib_dbg(chg, PR_OTG, "enabling VBUS in OTG mode\n"); rc = smblib_masked_write(chg, DCDC_CMD_OTG_REG, OTG_EN_BIT, OTG_EN_BIT); if (rc < 0) { smblib_err(chg, "Couldn't enable VBUS in OTG mode rc=%d\n", rc); return; } smblib_notify_extcon_props(chg, EXTCON_USB_HOST); } else { smblib_dbg(chg, PR_OTG, "disabling VBUS in OTG mode\n"); rc = smblib_masked_write(chg, DCDC_CMD_OTG_REG, OTG_EN_BIT, 0); if (rc < 0) { smblib_err(chg, "Couldn't disable VBUS in OTG mode rc=%d\n", rc); return; } } extcon_set_state_sync(chg->extcon, EXTCON_USB_HOST, enable); } Loading Loading @@ -2641,38 +2663,28 @@ int smblib_get_pe_start(struct smb_charger *chg, return 0; } int smblib_get_prop_die_health(struct smb_charger *chg, union power_supply_propval *val) int smblib_get_prop_die_health(struct smb_charger *chg) { int rc; u8 stat; rc = smblib_read(chg, TEMP_RANGE_STATUS_REG, &stat); rc = smblib_read(chg, DIE_TEMP_STATUS_REG, &stat); if (rc < 0) { smblib_err(chg, "Couldn't read TEMP_RANGE_STATUS_REG rc=%d\n", smblib_err(chg, "Couldn't read DIE_TEMP_STATUS_REG, rc=%d\n", rc); return rc; return POWER_SUPPLY_HEALTH_UNKNOWN; } /* TEMP_RANGE bits are mutually exclusive */ switch (stat & TEMP_RANGE_MASK) { case TEMP_BELOW_RANGE_BIT: val->intval = POWER_SUPPLY_HEALTH_COOL; break; case TEMP_WITHIN_RANGE_BIT: val->intval = POWER_SUPPLY_HEALTH_WARM; break; case TEMP_ABOVE_RANGE_BIT: val->intval = POWER_SUPPLY_HEALTH_HOT; break; case ALERT_LEVEL_BIT: val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; break; default: val->intval = POWER_SUPPLY_HEALTH_UNKNOWN; } if (stat & DIE_TEMP_RST_BIT) return POWER_SUPPLY_HEALTH_OVERHEAT; return 0; if (stat & DIE_TEMP_UB_BIT) return POWER_SUPPLY_HEALTH_HOT; if (stat & DIE_TEMP_LB_BIT) return POWER_SUPPLY_HEALTH_WARM; return POWER_SUPPLY_HEALTH_COOL; } int smblib_get_prop_connector_health(struct smb_charger *chg) Loading Loading @@ -3684,8 +3696,7 @@ static void smblib_handle_apsd_done(struct smb_charger *chg, bool rising) case SDP_CHARGER_BIT: case CDP_CHARGER_BIT: case FLOAT_CHARGER_BIT: if ((chg->connector_type == POWER_SUPPLY_CONNECTOR_MICRO_USB) || chg->use_extcon) if (chg->use_extcon) smblib_notify_device_mode(chg, true); break; case OCP_CHARGER_BIT: Loading
drivers/power/supply/qcom/smb5-lib.h +1 −2 Original line number Diff line number Diff line Loading @@ -557,8 +557,7 @@ int smblib_get_pe_start(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_charger_temp(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_die_health(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_die_health(struct smb_charger *chg); int smblib_get_prop_connector_health(struct smb_charger *chg); int smblib_set_prop_pd_current_max(struct smb_charger *chg, const union power_supply_propval *val); Loading
drivers/power/supply/qcom/smb5-reg.h +6 −0 Original line number Diff line number Diff line Loading @@ -403,6 +403,12 @@ enum { #define TEMP_BELOW_RANGE_BIT BIT(1) #define THERMREG_DISABLED_BIT BIT(0) #define DIE_TEMP_STATUS_REG (MISC_BASE + 0x07) #define DIE_TEMP_SHDN_BIT BIT(3) #define DIE_TEMP_RST_BIT BIT(2) #define DIE_TEMP_UB_BIT BIT(1) #define DIE_TEMP_LB_BIT BIT(0) #define CONNECTOR_TEMP_STATUS_REG (MISC_BASE + 0x09) #define CONNECTOR_TEMP_SHDN_BIT BIT(3) #define CONNECTOR_TEMP_RST_BIT BIT(2) Loading