Loading drivers/power/supply/qcom/smb5-lib.c +67 −0 Original line number Diff line number Diff line Loading @@ -2149,6 +2149,73 @@ int smblib_get_prop_usb_voltage_now(struct smb_charger *chg, return ret; } bool smblib_rsbux_low(struct smb_charger *chg, int r_thr) { int r_sbu1, r_sbu2; bool ret = false; int rc; if (!chg->iio.sbux_chan) return false; /* disable crude sensors */ rc = smblib_masked_write(chg, TYPE_C_CRUDE_SENSOR_CFG_REG, EN_SRC_CRUDE_SENSOR_BIT | EN_SNK_CRUDE_SENSOR_BIT, 0); if (rc < 0) { smblib_err(chg, "Couldn't disable crude sensor rc=%d\n", rc); return false; } /* select SBU1 as current source */ rc = smblib_write(chg, TYPE_C_SBU_CFG_REG, SEL_SBU1_ISRC_VAL); if (rc < 0) { smblib_err(chg, "Couldn't select SBU1 rc=%d\n", rc); goto cleanup; } rc = iio_read_channel_processed(chg->iio.sbux_chan, &r_sbu1); if (rc < 0) { smblib_err(chg, "Couldn't read SBU1 rc=%d\n", rc); goto cleanup; } if (r_sbu1 < r_thr) { ret = true; goto cleanup; } /* select SBU2 as current source */ rc = smblib_write(chg, TYPE_C_SBU_CFG_REG, SEL_SBU2_ISRC_VAL); if (rc < 0) { smblib_err(chg, "Couldn't select SBU1 rc=%d\n", rc); goto cleanup; } rc = iio_read_channel_processed(chg->iio.sbux_chan, &r_sbu2); if (rc < 0) { smblib_err(chg, "Couldn't read SBU1 rc=%d\n", rc); goto cleanup; } if (r_sbu2 < r_thr) ret = true; cleanup: /* enable crude sensors */ rc = smblib_masked_write(chg, TYPE_C_CRUDE_SENSOR_CFG_REG, EN_SRC_CRUDE_SENSOR_BIT | EN_SNK_CRUDE_SENSOR_BIT, EN_SRC_CRUDE_SENSOR_BIT | EN_SNK_CRUDE_SENSOR_BIT); if (rc < 0) smblib_err(chg, "Couldn't enable crude sensor rc=%d\n", rc); /* disable current source */ rc = smblib_write(chg, TYPE_C_SBU_CFG_REG, 0); if (rc < 0) smblib_err(chg, "Couldn't select SBU1 rc=%d\n", rc); return ret; } int smblib_get_prop_charger_temp(struct smb_charger *chg, union power_supply_propval *val) { Loading drivers/power/supply/qcom/smb5-reg.h +8 −0 Original line number Diff line number Diff line Loading @@ -336,6 +336,10 @@ enum { #define TYPEC_CCOUT_VALUE_BIT BIT(1) #define TYPEC_CCOUT_SRC_BIT BIT(0) #define TYPE_C_CRUDE_SENSOR_CFG_REG (TYPEC_BASE + 0x4e) #define EN_SRC_CRUDE_SENSOR_BIT BIT(1) #define EN_SNK_CRUDE_SENSOR_BIT BIT(0) #define TYPE_C_EXIT_STATE_CFG_REG (TYPEC_BASE + 0x50) #define BYPASS_VSAFE0V_DURING_ROLE_SWAP_BIT BIT(3) #define EXIT_SNK_BASED_ON_CC_BIT BIT(0) Loading Loading @@ -372,6 +376,10 @@ enum { #define TYPE_C_DEBOUNCE_OPTION_REG (TYPEC_BASE + 0x62) #define REDUCE_TCCDEBOUNCE_TO_2MS_BIT BIT(2) #define TYPE_C_SBU_CFG_REG (TYPEC_BASE + 0x6A) #define SEL_SBU1_ISRC_VAL 0x04 #define SEL_SBU2_ISRC_VAL 0x01 #define TYPEC_U_USB_CFG_REG (TYPEC_BASE + 0x70) #define EN_MICRO_USB_MODE_BIT BIT(0) Loading Loading
drivers/power/supply/qcom/smb5-lib.c +67 −0 Original line number Diff line number Diff line Loading @@ -2149,6 +2149,73 @@ int smblib_get_prop_usb_voltage_now(struct smb_charger *chg, return ret; } bool smblib_rsbux_low(struct smb_charger *chg, int r_thr) { int r_sbu1, r_sbu2; bool ret = false; int rc; if (!chg->iio.sbux_chan) return false; /* disable crude sensors */ rc = smblib_masked_write(chg, TYPE_C_CRUDE_SENSOR_CFG_REG, EN_SRC_CRUDE_SENSOR_BIT | EN_SNK_CRUDE_SENSOR_BIT, 0); if (rc < 0) { smblib_err(chg, "Couldn't disable crude sensor rc=%d\n", rc); return false; } /* select SBU1 as current source */ rc = smblib_write(chg, TYPE_C_SBU_CFG_REG, SEL_SBU1_ISRC_VAL); if (rc < 0) { smblib_err(chg, "Couldn't select SBU1 rc=%d\n", rc); goto cleanup; } rc = iio_read_channel_processed(chg->iio.sbux_chan, &r_sbu1); if (rc < 0) { smblib_err(chg, "Couldn't read SBU1 rc=%d\n", rc); goto cleanup; } if (r_sbu1 < r_thr) { ret = true; goto cleanup; } /* select SBU2 as current source */ rc = smblib_write(chg, TYPE_C_SBU_CFG_REG, SEL_SBU2_ISRC_VAL); if (rc < 0) { smblib_err(chg, "Couldn't select SBU1 rc=%d\n", rc); goto cleanup; } rc = iio_read_channel_processed(chg->iio.sbux_chan, &r_sbu2); if (rc < 0) { smblib_err(chg, "Couldn't read SBU1 rc=%d\n", rc); goto cleanup; } if (r_sbu2 < r_thr) ret = true; cleanup: /* enable crude sensors */ rc = smblib_masked_write(chg, TYPE_C_CRUDE_SENSOR_CFG_REG, EN_SRC_CRUDE_SENSOR_BIT | EN_SNK_CRUDE_SENSOR_BIT, EN_SRC_CRUDE_SENSOR_BIT | EN_SNK_CRUDE_SENSOR_BIT); if (rc < 0) smblib_err(chg, "Couldn't enable crude sensor rc=%d\n", rc); /* disable current source */ rc = smblib_write(chg, TYPE_C_SBU_CFG_REG, 0); if (rc < 0) smblib_err(chg, "Couldn't select SBU1 rc=%d\n", rc); return ret; } int smblib_get_prop_charger_temp(struct smb_charger *chg, union power_supply_propval *val) { Loading
drivers/power/supply/qcom/smb5-reg.h +8 −0 Original line number Diff line number Diff line Loading @@ -336,6 +336,10 @@ enum { #define TYPEC_CCOUT_VALUE_BIT BIT(1) #define TYPEC_CCOUT_SRC_BIT BIT(0) #define TYPE_C_CRUDE_SENSOR_CFG_REG (TYPEC_BASE + 0x4e) #define EN_SRC_CRUDE_SENSOR_BIT BIT(1) #define EN_SNK_CRUDE_SENSOR_BIT BIT(0) #define TYPE_C_EXIT_STATE_CFG_REG (TYPEC_BASE + 0x50) #define BYPASS_VSAFE0V_DURING_ROLE_SWAP_BIT BIT(3) #define EXIT_SNK_BASED_ON_CC_BIT BIT(0) Loading Loading @@ -372,6 +376,10 @@ enum { #define TYPE_C_DEBOUNCE_OPTION_REG (TYPEC_BASE + 0x62) #define REDUCE_TCCDEBOUNCE_TO_2MS_BIT BIT(2) #define TYPE_C_SBU_CFG_REG (TYPEC_BASE + 0x6A) #define SEL_SBU1_ISRC_VAL 0x04 #define SEL_SBU2_ISRC_VAL 0x01 #define TYPEC_U_USB_CFG_REG (TYPEC_BASE + 0x70) #define EN_MICRO_USB_MODE_BIT BIT(0) Loading