Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6c821356 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "power: qpnp-smblite: Add support for OTG IRQ"

parents c80f88e5 1cc0e479
Loading
Loading
Loading
Loading
+54 −0
Original line number Diff line number Diff line
@@ -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>
@@ -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;
@@ -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);
@@ -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;
}

@@ -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;
}

@@ -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)
+16 −0
Original line number Diff line number Diff line
@@ -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>
@@ -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 *
 ***************/
+3 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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);