Loading drivers/power/supply/qcom/qpnp-smblite.c +54 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ #include <linux/regmap.h> #include <linux/power_supply.h> #include <linux/of.h> #include <linux/of_gpio.h> #include <linux/of_irq.h> #include <linux/log2.h> #include <linux/qpnp/qpnp-revid.h> Loading Loading @@ -1156,6 +1157,28 @@ static int smblite_init_connector_type(struct smb_charger *chg) return 0; } static int smblite_init_otg(struct smblite *chip) { struct smb_charger *chg = &chip->chg; chg->usb_id_gpio = chg->usb_id_irq = -EINVAL; if (chg->connector_type == POWER_SUPPLY_CONNECTOR_TYPEC) return 0; if (of_find_property(chg->dev->of_node, "qcom,usb-id-gpio", NULL)) chg->usb_id_gpio = of_get_named_gpio(chg->dev->of_node, "qcom,usb-id-gpio", 0); chg->usb_id_irq = of_irq_get_byname(chg->dev->of_node, "usb_id_irq"); if (chg->usb_id_irq < 0 || chg->usb_id_gpio < 0) pr_err("OTG irq (%d) / gpio (%d) not defined\n", chg->usb_id_irq, chg->usb_id_gpio); return 0; } static int smblite_init_hw(struct smblite *chip) { struct smb_charger *chg = &chip->chg; Loading Loading @@ -1185,6 +1208,12 @@ static int smblite_init_hw(struct smblite *chip) return rc; } rc = smblite_init_otg(chip); if (rc < 0) { dev_err(chg->dev, "Couldn't init otg rc=%d\n", rc); return rc; } rc = schgm_flashlite_init(chg); if (rc < 0) { pr_err("Couldn't configure flash rc=%d\n", rc); Loading Loading @@ -1393,6 +1422,10 @@ static int smblite_determine_initial_status(struct smblite *chip) smblite_wdog_bark_irq_handler(0, &irq_data); smblite_typec_or_rid_detection_change_irq_handler(0, &irq_data); if (chg->usb_id_gpio > 0 && chg->connector_type == POWER_SUPPLY_CONNECTOR_MICRO_USB) smblite_usb_id_irq_handler(0, chg); return 0; } Loading Loading @@ -1644,6 +1677,22 @@ static int smblite_request_interrupts(struct smblite *chip) } } /* register the USB-id irq */ if (chg->usb_id_irq > 0 && chg->usb_id_gpio > 0) { rc = devm_request_threaded_irq(chg->dev, chg->usb_id_irq, NULL, smblite_usb_id_irq_handler, IRQF_ONESHOT | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, "smblite_id_irq", chg); if (rc < 0) { pr_err("Failed to register id-irq rc=%d\n", rc); return rc; } enable_irq_wake(chg->usb_id_irq); } return rc; } Loading @@ -1658,6 +1707,11 @@ static void smblite_disable_interrupts(struct smb_charger *chg) disable_irq(smblite_irqs[i].irq); } } if (chg->usb_id_irq > 0 && chg->usb_id_gpio > 0) { disable_irq_wake(chg->usb_id_irq); disable_irq(chg->usb_id_irq); } } #if defined(CONFIG_DEBUG_FS) Loading drivers/power/supply/qcom/smblite-lib.c +16 −0 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ #include <linux/delay.h> #include <linux/power_supply.h> #include <linux/qpnp/qpnp-revid.h> #include <linux/gpio.h> #include <linux/irq.h> #include <linux/iio/consumer.h> #include <linux/pmic-voter.h> Loading Loading @@ -2772,6 +2773,21 @@ irqreturn_t smblite_usbin_ov_irq_handler(int irq, void *data) return IRQ_HANDLED; } irqreturn_t smblite_usb_id_irq_handler(int irq, void *data) { struct smb_charger *chg = data; bool id_state; id_state = gpio_get_value(chg->usb_id_gpio); smblite_lib_dbg(chg, PR_INTERRUPT, "IRQ: %s, id_state=%d\n", "usb-id-irq", id_state); smblite_lib_notify_usb_host(chg, !id_state); return IRQ_HANDLED; } /*************** * Work Queues * ***************/ Loading drivers/power/supply/qcom/smblite-lib.h +3 −0 Original line number Diff line number Diff line Loading @@ -313,6 +313,8 @@ struct smb_charger { bool aicl_max_reached; bool pr_swap_in_progress; bool ldo_mode; int usb_id_gpio; int usb_id_irq; /* workaround flag */ u32 wa_flags; Loading Loading @@ -365,6 +367,7 @@ irqreturn_t smblite_typec_or_rid_detection_change_irq_handler(int irq, void *data); irqreturn_t smblite_temp_change_irq_handler(int irq, void *data); irqreturn_t smblite_usbin_ov_irq_handler(int irq, void *data); irqreturn_t smblite_usb_id_irq_handler(int irq, void *data); int smblite_lib_get_prop_input_suspend(struct smb_charger *chg, union power_supply_propval *val); Loading Loading
drivers/power/supply/qcom/qpnp-smblite.c +54 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ #include <linux/regmap.h> #include <linux/power_supply.h> #include <linux/of.h> #include <linux/of_gpio.h> #include <linux/of_irq.h> #include <linux/log2.h> #include <linux/qpnp/qpnp-revid.h> Loading Loading @@ -1156,6 +1157,28 @@ static int smblite_init_connector_type(struct smb_charger *chg) return 0; } static int smblite_init_otg(struct smblite *chip) { struct smb_charger *chg = &chip->chg; chg->usb_id_gpio = chg->usb_id_irq = -EINVAL; if (chg->connector_type == POWER_SUPPLY_CONNECTOR_TYPEC) return 0; if (of_find_property(chg->dev->of_node, "qcom,usb-id-gpio", NULL)) chg->usb_id_gpio = of_get_named_gpio(chg->dev->of_node, "qcom,usb-id-gpio", 0); chg->usb_id_irq = of_irq_get_byname(chg->dev->of_node, "usb_id_irq"); if (chg->usb_id_irq < 0 || chg->usb_id_gpio < 0) pr_err("OTG irq (%d) / gpio (%d) not defined\n", chg->usb_id_irq, chg->usb_id_gpio); return 0; } static int smblite_init_hw(struct smblite *chip) { struct smb_charger *chg = &chip->chg; Loading Loading @@ -1185,6 +1208,12 @@ static int smblite_init_hw(struct smblite *chip) return rc; } rc = smblite_init_otg(chip); if (rc < 0) { dev_err(chg->dev, "Couldn't init otg rc=%d\n", rc); return rc; } rc = schgm_flashlite_init(chg); if (rc < 0) { pr_err("Couldn't configure flash rc=%d\n", rc); Loading Loading @@ -1393,6 +1422,10 @@ static int smblite_determine_initial_status(struct smblite *chip) smblite_wdog_bark_irq_handler(0, &irq_data); smblite_typec_or_rid_detection_change_irq_handler(0, &irq_data); if (chg->usb_id_gpio > 0 && chg->connector_type == POWER_SUPPLY_CONNECTOR_MICRO_USB) smblite_usb_id_irq_handler(0, chg); return 0; } Loading Loading @@ -1644,6 +1677,22 @@ static int smblite_request_interrupts(struct smblite *chip) } } /* register the USB-id irq */ if (chg->usb_id_irq > 0 && chg->usb_id_gpio > 0) { rc = devm_request_threaded_irq(chg->dev, chg->usb_id_irq, NULL, smblite_usb_id_irq_handler, IRQF_ONESHOT | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, "smblite_id_irq", chg); if (rc < 0) { pr_err("Failed to register id-irq rc=%d\n", rc); return rc; } enable_irq_wake(chg->usb_id_irq); } return rc; } Loading @@ -1658,6 +1707,11 @@ static void smblite_disable_interrupts(struct smb_charger *chg) disable_irq(smblite_irqs[i].irq); } } if (chg->usb_id_irq > 0 && chg->usb_id_gpio > 0) { disable_irq_wake(chg->usb_id_irq); disable_irq(chg->usb_id_irq); } } #if defined(CONFIG_DEBUG_FS) Loading
drivers/power/supply/qcom/smblite-lib.c +16 −0 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ #include <linux/delay.h> #include <linux/power_supply.h> #include <linux/qpnp/qpnp-revid.h> #include <linux/gpio.h> #include <linux/irq.h> #include <linux/iio/consumer.h> #include <linux/pmic-voter.h> Loading Loading @@ -2772,6 +2773,21 @@ irqreturn_t smblite_usbin_ov_irq_handler(int irq, void *data) return IRQ_HANDLED; } irqreturn_t smblite_usb_id_irq_handler(int irq, void *data) { struct smb_charger *chg = data; bool id_state; id_state = gpio_get_value(chg->usb_id_gpio); smblite_lib_dbg(chg, PR_INTERRUPT, "IRQ: %s, id_state=%d\n", "usb-id-irq", id_state); smblite_lib_notify_usb_host(chg, !id_state); return IRQ_HANDLED; } /*************** * Work Queues * ***************/ Loading
drivers/power/supply/qcom/smblite-lib.h +3 −0 Original line number Diff line number Diff line Loading @@ -313,6 +313,8 @@ struct smb_charger { bool aicl_max_reached; bool pr_swap_in_progress; bool ldo_mode; int usb_id_gpio; int usb_id_irq; /* workaround flag */ u32 wa_flags; Loading Loading @@ -365,6 +367,7 @@ irqreturn_t smblite_typec_or_rid_detection_change_irq_handler(int irq, void *data); irqreturn_t smblite_temp_change_irq_handler(int irq, void *data); irqreturn_t smblite_usbin_ov_irq_handler(int irq, void *data); irqreturn_t smblite_usb_id_irq_handler(int irq, void *data); int smblite_lib_get_prop_input_suspend(struct smb_charger *chg, union power_supply_propval *val); Loading