Loading drivers/power/supply/qcom/qpnp-smb5.c +9 −0 Original line number Diff line number Diff line Loading @@ -1073,6 +1073,7 @@ static enum power_supply_property smb5_usb_main_props[] = { POWER_SUPPLY_PROP_FLASH_TRIGGER, POWER_SUPPLY_PROP_TOGGLE_STAT, POWER_SUPPLY_PROP_MAIN_FCC_MAX, POWER_SUPPLY_PROP_IRQ_STATUS, }; static int smb5_usb_main_get_prop(struct power_supply *psy, Loading Loading @@ -1118,6 +1119,9 @@ static int smb5_usb_main_get_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_MAIN_FCC_MAX: val->intval = chg->main_fcc_max; break; case POWER_SUPPLY_PROP_IRQ_STATUS: rc = smblib_get_irq_status(chg, val); break; default: pr_debug("get prop %d is not supported in usb-main\n", psp); rc = -EINVAL; Loading Loading @@ -3072,6 +3076,11 @@ static struct smb_irq_info smb5_irqs[] = { [FLASH_EN_IRQ] = { .name = "flash-en", }, /* SDAM */ [SDAM_STS_IRQ] = { .name = "sdam-sts", .handler = sdam_sts_change_irq_handler, }, }; static int smb5_get_irq_index_byname(const char *irq_name) Loading drivers/power/supply/qcom/smb5-lib.c +39 −0 Original line number Diff line number Diff line Loading @@ -1416,6 +1416,29 @@ int smblib_toggle_smb_en(struct smb_charger *chg, int toggle) return rc; } int smblib_get_irq_status(struct smb_charger *chg, union power_supply_propval *val) { int rc; u8 reg; mutex_lock(&chg->irq_status_lock); /* Report and clear cached status */ val->intval = chg->irq_status; chg->irq_status = 0; /* get real time status of pulse skip irq */ rc = smblib_read(chg, MISC_PBS_RT_STS_REG, ®); if (rc < 0) smblib_err(chg, "Couldn't read MISC_PBS_RT_STS_REG rc=%d\n", rc); else val->intval |= (reg & PULSE_SKIP_IRQ_BIT); mutex_unlock(&chg->irq_status_lock); return rc; } /**************************** * uUSB Moisture Protection * ****************************/ Loading Loading @@ -4470,6 +4493,21 @@ irqreturn_t default_irq_handler(int irq, void *data) return IRQ_HANDLED; } irqreturn_t sdam_sts_change_irq_handler(int irq, void *data) { struct smb_irq_data *irq_data = data; struct smb_charger *chg = irq_data->parent_data; smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name); mutex_lock(&chg->irq_status_lock); chg->irq_status |= PULSE_SKIP_IRQ_BIT; mutex_unlock(&chg->irq_status_lock); power_supply_changed(chg->usb_main_psy); return IRQ_HANDLED; } #define CHG_TERM_WA_ENTRY_DELAY_MS 300000 /* 5 min */ #define CHG_TERM_WA_EXIT_DELAY_MS 60000 /* 1 min */ static void smblib_eval_chg_termination(struct smb_charger *chg, u8 batt_status) Loading Loading @@ -6864,6 +6902,7 @@ int smblib_init(struct smb_charger *chg) int rc = 0; mutex_init(&chg->smb_lock); mutex_init(&chg->irq_status_lock); INIT_WORK(&chg->bms_update_work, bms_update_work); INIT_WORK(&chg->pl_update_work, pl_update_work); INIT_WORK(&chg->jeita_update_work, jeita_update_work); Loading drivers/power/supply/qcom/smb5-lib.h +6 −1 Original line number Diff line number Diff line Loading @@ -211,6 +211,7 @@ enum smb_irq_index { FLASH_STATE_CHANGE_IRQ, TORCH_REQ_IRQ, FLASH_EN_IRQ, SDAM_STS_IRQ, /* END */ SMB_IRQ_MAX, }; Loading Loading @@ -375,6 +376,7 @@ struct smb_charger { struct mutex smb_lock; struct mutex ps_change_lock; struct mutex dr_lock; struct mutex irq_status_lock; /* power supplies */ struct power_supply *batt_psy; Loading Loading @@ -551,6 +553,7 @@ struct smb_charger { u32 headroom_mode; bool flash_init_done; bool flash_active; u32 irq_status; /* wireless */ int wireless_vout; Loading Loading @@ -610,7 +613,7 @@ irqreturn_t wdog_bark_irq_handler(int irq, void *data); irqreturn_t typec_or_rid_detection_change_irq_handler(int irq, void *data); irqreturn_t temp_change_irq_handler(int irq, void *data); irqreturn_t usbin_ov_irq_handler(int irq, void *data); irqreturn_t sdam_sts_change_irq_handler(int irq, void *data); int smblib_get_prop_input_suspend(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_batt_present(struct smb_charger *chg, Loading Loading @@ -751,6 +754,8 @@ void smblib_hvdcp_detect_enable(struct smb_charger *chg, bool enable); void smblib_hvdcp_exit_config(struct smb_charger *chg); void smblib_apsd_enable(struct smb_charger *chg, bool enable); int smblib_force_vbus_voltage(struct smb_charger *chg, u8 val); int smblib_get_irq_status(struct smb_charger *chg, union power_supply_propval *val); int smblib_init(struct smb_charger *chg); int smblib_deinit(struct smb_charger *chg); Loading drivers/power/supply/qcom/smb5-reg.h +4 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ #define DCIN_BASE 0x1400 #define TYPEC_BASE 0X1500 #define MISC_BASE 0x1600 #define MISC_PBS_BASE 0x7500 #define PERPH_TYPE_OFFSET 0x04 #define TYPE_MASK GENMASK(7, 0) Loading Loading @@ -548,4 +549,7 @@ enum { #define SMB_REG_H_THRESHOLD_MSB_REG (MISC_BASE + 0XBC) /* SDAM regs */ #define MISC_PBS_RT_STS_REG (MISC_PBS_BASE + 0x10) #define PULSE_SKIP_IRQ_BIT BIT(4) #endif /* __SMB5_CHARGER_REG_H */ Loading
drivers/power/supply/qcom/qpnp-smb5.c +9 −0 Original line number Diff line number Diff line Loading @@ -1073,6 +1073,7 @@ static enum power_supply_property smb5_usb_main_props[] = { POWER_SUPPLY_PROP_FLASH_TRIGGER, POWER_SUPPLY_PROP_TOGGLE_STAT, POWER_SUPPLY_PROP_MAIN_FCC_MAX, POWER_SUPPLY_PROP_IRQ_STATUS, }; static int smb5_usb_main_get_prop(struct power_supply *psy, Loading Loading @@ -1118,6 +1119,9 @@ static int smb5_usb_main_get_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_MAIN_FCC_MAX: val->intval = chg->main_fcc_max; break; case POWER_SUPPLY_PROP_IRQ_STATUS: rc = smblib_get_irq_status(chg, val); break; default: pr_debug("get prop %d is not supported in usb-main\n", psp); rc = -EINVAL; Loading Loading @@ -3072,6 +3076,11 @@ static struct smb_irq_info smb5_irqs[] = { [FLASH_EN_IRQ] = { .name = "flash-en", }, /* SDAM */ [SDAM_STS_IRQ] = { .name = "sdam-sts", .handler = sdam_sts_change_irq_handler, }, }; static int smb5_get_irq_index_byname(const char *irq_name) Loading
drivers/power/supply/qcom/smb5-lib.c +39 −0 Original line number Diff line number Diff line Loading @@ -1416,6 +1416,29 @@ int smblib_toggle_smb_en(struct smb_charger *chg, int toggle) return rc; } int smblib_get_irq_status(struct smb_charger *chg, union power_supply_propval *val) { int rc; u8 reg; mutex_lock(&chg->irq_status_lock); /* Report and clear cached status */ val->intval = chg->irq_status; chg->irq_status = 0; /* get real time status of pulse skip irq */ rc = smblib_read(chg, MISC_PBS_RT_STS_REG, ®); if (rc < 0) smblib_err(chg, "Couldn't read MISC_PBS_RT_STS_REG rc=%d\n", rc); else val->intval |= (reg & PULSE_SKIP_IRQ_BIT); mutex_unlock(&chg->irq_status_lock); return rc; } /**************************** * uUSB Moisture Protection * ****************************/ Loading Loading @@ -4470,6 +4493,21 @@ irqreturn_t default_irq_handler(int irq, void *data) return IRQ_HANDLED; } irqreturn_t sdam_sts_change_irq_handler(int irq, void *data) { struct smb_irq_data *irq_data = data; struct smb_charger *chg = irq_data->parent_data; smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name); mutex_lock(&chg->irq_status_lock); chg->irq_status |= PULSE_SKIP_IRQ_BIT; mutex_unlock(&chg->irq_status_lock); power_supply_changed(chg->usb_main_psy); return IRQ_HANDLED; } #define CHG_TERM_WA_ENTRY_DELAY_MS 300000 /* 5 min */ #define CHG_TERM_WA_EXIT_DELAY_MS 60000 /* 1 min */ static void smblib_eval_chg_termination(struct smb_charger *chg, u8 batt_status) Loading Loading @@ -6864,6 +6902,7 @@ int smblib_init(struct smb_charger *chg) int rc = 0; mutex_init(&chg->smb_lock); mutex_init(&chg->irq_status_lock); INIT_WORK(&chg->bms_update_work, bms_update_work); INIT_WORK(&chg->pl_update_work, pl_update_work); INIT_WORK(&chg->jeita_update_work, jeita_update_work); Loading
drivers/power/supply/qcom/smb5-lib.h +6 −1 Original line number Diff line number Diff line Loading @@ -211,6 +211,7 @@ enum smb_irq_index { FLASH_STATE_CHANGE_IRQ, TORCH_REQ_IRQ, FLASH_EN_IRQ, SDAM_STS_IRQ, /* END */ SMB_IRQ_MAX, }; Loading Loading @@ -375,6 +376,7 @@ struct smb_charger { struct mutex smb_lock; struct mutex ps_change_lock; struct mutex dr_lock; struct mutex irq_status_lock; /* power supplies */ struct power_supply *batt_psy; Loading Loading @@ -551,6 +553,7 @@ struct smb_charger { u32 headroom_mode; bool flash_init_done; bool flash_active; u32 irq_status; /* wireless */ int wireless_vout; Loading Loading @@ -610,7 +613,7 @@ irqreturn_t wdog_bark_irq_handler(int irq, void *data); irqreturn_t typec_or_rid_detection_change_irq_handler(int irq, void *data); irqreturn_t temp_change_irq_handler(int irq, void *data); irqreturn_t usbin_ov_irq_handler(int irq, void *data); irqreturn_t sdam_sts_change_irq_handler(int irq, void *data); int smblib_get_prop_input_suspend(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_batt_present(struct smb_charger *chg, Loading Loading @@ -751,6 +754,8 @@ void smblib_hvdcp_detect_enable(struct smb_charger *chg, bool enable); void smblib_hvdcp_exit_config(struct smb_charger *chg); void smblib_apsd_enable(struct smb_charger *chg, bool enable); int smblib_force_vbus_voltage(struct smb_charger *chg, u8 val); int smblib_get_irq_status(struct smb_charger *chg, union power_supply_propval *val); int smblib_init(struct smb_charger *chg); int smblib_deinit(struct smb_charger *chg); Loading
drivers/power/supply/qcom/smb5-reg.h +4 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ #define DCIN_BASE 0x1400 #define TYPEC_BASE 0X1500 #define MISC_BASE 0x1600 #define MISC_PBS_BASE 0x7500 #define PERPH_TYPE_OFFSET 0x04 #define TYPE_MASK GENMASK(7, 0) Loading Loading @@ -548,4 +549,7 @@ enum { #define SMB_REG_H_THRESHOLD_MSB_REG (MISC_BASE + 0XBC) /* SDAM regs */ #define MISC_PBS_RT_STS_REG (MISC_PBS_BASE + 0x10) #define PULSE_SKIP_IRQ_BIT BIT(4) #endif /* __SMB5_CHARGER_REG_H */