soc: qcom: smsm: Implement support for get_irqchip_state
authorStephan Gerhold <stephan@gerhold.net>
Mon, 12 Jul 2021 13:57:02 +0000 (15:57 +0200)
committerBjorn Andersson <bjorn.andersson@linaro.org>
Thu, 5 Aug 2021 03:20:03 +0000 (22:20 -0500)
At the moment there is no way for drivers to get the current state
of the interrupt signal reported by a remote processor. The irqchip
API has generic functionality for this, using irq_get_irqchip_state().

Implement support for getting the IRQCHIP_STATE_LINE_LEVEL by reading
the remote state and checking the bit for the specified IRQ.

Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
Link: https://lore.kernel.org/r/20210712135703.324748-1-stephan@gerhold.net
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
drivers/soc/qcom/smsm.c

index 1d3d5e3ec2b0737a7b1ecb5a2b13457d584ece16..a48f9db98836a54cb20ccb3c15a84557462195b3 100644 (file)
@@ -299,11 +299,28 @@ static int smsm_set_irq_type(struct irq_data *irqd, unsigned int type)
        return 0;
 }
 
+static int smsm_get_irqchip_state(struct irq_data *irqd,
+                                 enum irqchip_irq_state which, bool *state)
+{
+       struct smsm_entry *entry = irq_data_get_irq_chip_data(irqd);
+       irq_hw_number_t irq = irqd_to_hwirq(irqd);
+       u32 val;
+
+       if (which != IRQCHIP_STATE_LINE_LEVEL)
+               return -EINVAL;
+
+       val = readl(entry->remote_state);
+       *state = !!(val & BIT(irq));
+
+       return 0;
+}
+
 static struct irq_chip smsm_irq_chip = {
        .name           = "smsm",
        .irq_mask       = smsm_mask_irq,
        .irq_unmask     = smsm_unmask_irq,
        .irq_set_type   = smsm_set_irq_type,
+       .irq_get_irqchip_state = smsm_get_irqchip_state,
 };
 
 /**