Loading Documentation/devicetree/bindings/power/supply/qcom/qpnp-smbcharger.txt +1 −0 Original line number Diff line number Diff line Loading @@ -281,6 +281,7 @@ Optional Properties: suspending USB path for fake battery. - qcom,vchg_sns-vadc Phandle of the VADC node. - qcom,usbin-vadc Phandle of the VADC node. - qcom,vchg-adc-channel-id The ADC channel to which the VCHG is routed. Example: Loading drivers/power/supply/qcom/qpnp-smbcharger.c +54 −1 Original line number Diff line number Diff line Loading @@ -277,6 +277,7 @@ struct smbchg_chip { bool skip_usb_notification; u32 vchg_adc_channel; struct qpnp_vadc_chip *vchg_vadc_dev; struct qpnp_vadc_chip *vusb_vadc_dev; /* voters */ struct votable *fcc_votable; Loading Loading @@ -5744,9 +5745,43 @@ static void update_typec_otg_status(struct smbchg_chip *chip, int mode, } } static int smbchg_get_vusb(struct smbchg_chip *chip) { int rc; struct qpnp_vadc_result adc_result; if (!is_usb_present(chip)) return 0; if (chip->vusb_vadc_dev) { rc = qpnp_vadc_read(chip->vusb_vadc_dev, USBIN, &adc_result); if (rc < 0) { pr_smb(PR_STATUS, "error in vusb_uv read rc = %d\n", rc); return rc; } } else { return -ENODATA; } pr_smb(PR_STATUS, "The value of vusb_uv %lld\n", adc_result.physical); return adc_result.physical; } static int smbchg_set_sdp_current(struct smbchg_chip *chip, int current_ma) { if (chip->usb_supply_type == POWER_SUPPLY_TYPE_USB) { if (current_ma == -ETIMEDOUT) { /* float charger */ current_ma = CURRENT_1500_MA; pr_smb(PR_MISC, "Update usb_type to FLOAT current=%dmA\n", current_ma); chip->usb_psy_d.type = POWER_SUPPLY_TYPE_USB_FLOAT; } else { current_ma = current_ma / 1000; } /* Override if type-c charger used */ if (chip->typec_current_ma > 500 && current_ma < chip->typec_current_ma) { Loading Loading @@ -5789,6 +5824,9 @@ static int smbchg_usb_get_property(struct power_supply *psy, case POWER_SUPPLY_PROP_HEALTH: val->intval = chip->usb_health; break; case POWER_SUPPLY_PROP_VOLTAGE_NOW: val->intval = smbchg_get_vusb(chip); break; default: return -EINVAL; } Loading @@ -5807,7 +5845,7 @@ static int smbchg_usb_set_property(struct power_supply *psy, break; case POWER_SUPPLY_PROP_CURRENT_MAX: case POWER_SUPPLY_PROP_SDP_CURRENT_MAX: smbchg_set_sdp_current(chip, val->intval / 1000); smbchg_set_sdp_current(chip, val->intval); default: return -EINVAL; } Loading Loading @@ -5844,6 +5882,7 @@ static enum power_supply_property smbchg_usb_properties[] = { POWER_SUPPLY_PROP_REAL_TYPE, POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_PROP_SDP_CURRENT_MAX, POWER_SUPPLY_PROP_VOLTAGE_NOW, }; #define CHARGE_OUTPUT_VTG_RATIO 840 Loading Loading @@ -8191,6 +8230,7 @@ static int smbchg_probe(struct platform_device *pdev) struct smbchg_chip *chip; struct power_supply *typec_psy = NULL; struct qpnp_vadc_chip *vadc_dev = NULL, *vchg_vadc_dev = NULL; struct qpnp_vadc_chip *vusb_vadc_dev = NULL; const char *typec_psy_name; struct power_supply_config usb_psy_cfg = {}; struct power_supply_config batt_psy_cfg = {}; Loading Loading @@ -8239,6 +8279,18 @@ static int smbchg_probe(struct platform_device *pdev) } } vusb_vadc_dev = NULL; if (of_find_property(pdev->dev.of_node, "qcom,usbin-vadc", NULL)) { vusb_vadc_dev = qpnp_get_vadc(&pdev->dev, "usbin"); if (IS_ERR(vusb_vadc_dev)) { rc = PTR_ERR(vusb_vadc_dev); if (rc != -EPROBE_DEFER) dev_err(&pdev->dev, "Couldn't get vadc 'usbin' rc=%d\n", rc); return rc; } } chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL); if (!chip) Loading Loading @@ -8344,6 +8396,7 @@ static int smbchg_probe(struct platform_device *pdev) init_completion(&chip->usbin_uv_raised); chip->vadc_dev = vadc_dev; chip->vchg_vadc_dev = vchg_vadc_dev; chip->vusb_vadc_dev = vusb_vadc_dev; chip->pdev = pdev; chip->dev = &pdev->dev; Loading Loading
Documentation/devicetree/bindings/power/supply/qcom/qpnp-smbcharger.txt +1 −0 Original line number Diff line number Diff line Loading @@ -281,6 +281,7 @@ Optional Properties: suspending USB path for fake battery. - qcom,vchg_sns-vadc Phandle of the VADC node. - qcom,usbin-vadc Phandle of the VADC node. - qcom,vchg-adc-channel-id The ADC channel to which the VCHG is routed. Example: Loading
drivers/power/supply/qcom/qpnp-smbcharger.c +54 −1 Original line number Diff line number Diff line Loading @@ -277,6 +277,7 @@ struct smbchg_chip { bool skip_usb_notification; u32 vchg_adc_channel; struct qpnp_vadc_chip *vchg_vadc_dev; struct qpnp_vadc_chip *vusb_vadc_dev; /* voters */ struct votable *fcc_votable; Loading Loading @@ -5744,9 +5745,43 @@ static void update_typec_otg_status(struct smbchg_chip *chip, int mode, } } static int smbchg_get_vusb(struct smbchg_chip *chip) { int rc; struct qpnp_vadc_result adc_result; if (!is_usb_present(chip)) return 0; if (chip->vusb_vadc_dev) { rc = qpnp_vadc_read(chip->vusb_vadc_dev, USBIN, &adc_result); if (rc < 0) { pr_smb(PR_STATUS, "error in vusb_uv read rc = %d\n", rc); return rc; } } else { return -ENODATA; } pr_smb(PR_STATUS, "The value of vusb_uv %lld\n", adc_result.physical); return adc_result.physical; } static int smbchg_set_sdp_current(struct smbchg_chip *chip, int current_ma) { if (chip->usb_supply_type == POWER_SUPPLY_TYPE_USB) { if (current_ma == -ETIMEDOUT) { /* float charger */ current_ma = CURRENT_1500_MA; pr_smb(PR_MISC, "Update usb_type to FLOAT current=%dmA\n", current_ma); chip->usb_psy_d.type = POWER_SUPPLY_TYPE_USB_FLOAT; } else { current_ma = current_ma / 1000; } /* Override if type-c charger used */ if (chip->typec_current_ma > 500 && current_ma < chip->typec_current_ma) { Loading Loading @@ -5789,6 +5824,9 @@ static int smbchg_usb_get_property(struct power_supply *psy, case POWER_SUPPLY_PROP_HEALTH: val->intval = chip->usb_health; break; case POWER_SUPPLY_PROP_VOLTAGE_NOW: val->intval = smbchg_get_vusb(chip); break; default: return -EINVAL; } Loading @@ -5807,7 +5845,7 @@ static int smbchg_usb_set_property(struct power_supply *psy, break; case POWER_SUPPLY_PROP_CURRENT_MAX: case POWER_SUPPLY_PROP_SDP_CURRENT_MAX: smbchg_set_sdp_current(chip, val->intval / 1000); smbchg_set_sdp_current(chip, val->intval); default: return -EINVAL; } Loading Loading @@ -5844,6 +5882,7 @@ static enum power_supply_property smbchg_usb_properties[] = { POWER_SUPPLY_PROP_REAL_TYPE, POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_PROP_SDP_CURRENT_MAX, POWER_SUPPLY_PROP_VOLTAGE_NOW, }; #define CHARGE_OUTPUT_VTG_RATIO 840 Loading Loading @@ -8191,6 +8230,7 @@ static int smbchg_probe(struct platform_device *pdev) struct smbchg_chip *chip; struct power_supply *typec_psy = NULL; struct qpnp_vadc_chip *vadc_dev = NULL, *vchg_vadc_dev = NULL; struct qpnp_vadc_chip *vusb_vadc_dev = NULL; const char *typec_psy_name; struct power_supply_config usb_psy_cfg = {}; struct power_supply_config batt_psy_cfg = {}; Loading Loading @@ -8239,6 +8279,18 @@ static int smbchg_probe(struct platform_device *pdev) } } vusb_vadc_dev = NULL; if (of_find_property(pdev->dev.of_node, "qcom,usbin-vadc", NULL)) { vusb_vadc_dev = qpnp_get_vadc(&pdev->dev, "usbin"); if (IS_ERR(vusb_vadc_dev)) { rc = PTR_ERR(vusb_vadc_dev); if (rc != -EPROBE_DEFER) dev_err(&pdev->dev, "Couldn't get vadc 'usbin' rc=%d\n", rc); return rc; } } chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL); if (!chip) Loading Loading @@ -8344,6 +8396,7 @@ static int smbchg_probe(struct platform_device *pdev) init_completion(&chip->usbin_uv_raised); chip->vadc_dev = vadc_dev; chip->vchg_vadc_dev = vchg_vadc_dev; chip->vusb_vadc_dev = vusb_vadc_dev; chip->pdev = pdev; chip->dev = &pdev->dev; Loading