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

Commit 19bbf02b authored by Chris Lew's avatar Chris Lew
Browse files

soc: qcom: qsee_ipc_irq: Change to level trigger irq



Change the expected irq handling to level interrupts and add the
IRQF_ONESHOT flag to perform proper mask handling. Move the irq clear
before the work to prevent missing the level trigger interrupt.

Change-Id: I290f1534601f4aa625c9a8f5c564019e4eaf5359
Signed-off-by: default avatarChris Lew <clew@codeaurora.org>
parent 9e2c041e
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -92,9 +92,10 @@ static irqreturn_t qsee_intr(int irq, void *data)

		irq_pin = irq_find_mapping(qirq->domain, to_hwirq(i, j));
		desc = irq_to_desc(irq_pin);
		if (desc)
			handle_simple_irq(desc);

		regmap_write(qirq->regmap, bank->data->clear, BIT(j));
		if (desc)
			handle_level_irq(desc);
	}

	return IRQ_HANDLED;
@@ -152,6 +153,9 @@ static int qsee_set_irq_type(struct irq_data *irqd, unsigned int type)
	bit = hwirq_to_bit(irq);
	bank = &qirq->banks[index];

	if (type & IRQ_TYPE_LEVEL_HIGH)
		return 0;

	if (!(type & IRQ_TYPE_EDGE_BOTH))
		return -EINVAL;

@@ -281,7 +285,8 @@ static int qsee_irq_probe(struct platform_device *pdev)
		regmap_write(qirq->regmap, bank->data->mask, mask);

		ret = devm_request_irq(dev, bank->irq, qsee_intr,
				       IRQF_NO_SUSPEND, "qsee_irq", qirq);
				       IRQF_NO_SUSPEND | IRQF_ONESHOT,
				       "qsee_irq", qirq);
		if (ret) {
			dev_err(dev, "failed to request interrupt\n");
			return ret;