Patchwork [v3,2/6] spmi: pmic-arb: convert to v2 irq interfaces to support hierarchical IRQ chips

login
register
mail settings
Submitter Brian Masney
Date Jan. 10, 2019, 1:12 a.m.
Message ID <20190110011258.17227-3-masneyb@onstation.org>
Download mbox | patch
Permalink /patch/696273/
State New
Headers show

Comments

Brian Masney - Jan. 10, 2019, 1:12 a.m.
Convert the spmi-pmic-arb IRQ code to use the version 2 IRQ interface
in order to support hierarchical IRQ chips. This is necessary so that
spmi-gpio can be setup as a hierarchical IRQ chip with pmic-arb as the
parent. IRQ chips in device tree should be usable from the start without
the consumer having to make an additional call to gpio[d]_to_irq() to
get the proper IRQ on the parent. Driver was tested on a LG Nexus 5
(hammerhead) phone.

Signed-off-by: Brian Masney <masneyb@onstation.org>
---
Changes since v2:
- None

Changes since v1:
- Add intspec variable to qpnpint_irq_domain_translate to reduce the
  overall diff.
- Remove irq_domain_disassociate hack.

 drivers/spmi/spmi-pmic-arb.c | 58 +++++++++++++++++++++++-------------
 1 file changed, 38 insertions(+), 20 deletions(-)
Stephen Boyd - Jan. 11, 2019, 10:07 p.m.
Quoting Brian Masney (2019-01-09 17:12:54)
> Convert the spmi-pmic-arb IRQ code to use the version 2 IRQ interface
> in order to support hierarchical IRQ chips. This is necessary so that
> spmi-gpio can be setup as a hierarchical IRQ chip with pmic-arb as the
> parent. IRQ chips in device tree should be usable from the start without
> the consumer having to make an additional call to gpio[d]_to_irq() to
> get the proper IRQ on the parent. Driver was tested on a LG Nexus 5
> (hammerhead) phone.
> 
> Signed-off-by: Brian Masney <masneyb@onstation.org>
> ---
> Changes since v2:
> - None
> 
> Changes since v1:
> - Add intspec variable to qpnpint_irq_domain_translate to reduce the
>   overall diff.
> - Remove irq_domain_disassociate hack.

I thought we would need to keep that around? And then dispose of the
hack later on. Won't this just wreck the world almost immediately
because the MFD is counting irqs from DT?
Brian Masney - Jan. 11, 2019, 11 p.m.
On Fri, Jan 11, 2019 at 02:07:09PM -0800, Stephen Boyd wrote:
> Quoting Brian Masney (2019-01-09 17:12:54)
> > Convert the spmi-pmic-arb IRQ code to use the version 2 IRQ interface
> > in order to support hierarchical IRQ chips. This is necessary so that
> > spmi-gpio can be setup as a hierarchical IRQ chip with pmic-arb as the
> > parent. IRQ chips in device tree should be usable from the start without
> > the consumer having to make an additional call to gpio[d]_to_irq() to
> > get the proper IRQ on the parent. Driver was tested on a LG Nexus 5
> > (hammerhead) phone.
> > 
> > Signed-off-by: Brian Masney <masneyb@onstation.org>
> > ---
> > Changes since v2:
> > - None
> > 
> > Changes since v1:
> > - Add intspec variable to qpnpint_irq_domain_translate to reduce the
> >   overall diff.
> > - Remove irq_domain_disassociate hack.
> 
> I thought we would need to keep that around? And then dispose of the
> hack later on. Won't this just wreck the world almost immediately
> because the MFD is counting irqs from DT?

We won't run into the issue with the MFD counting the IRQs since the
interrupts property was removed and the interrupt-controller property
was added to device tree in the same patch. The interrupts property that
we ultimately don't need was the issue that I ran into with the MFD
subsystem.

However to be certain, I retested and we need the temporary hack since
pmic_gpio_to_irq in this series uses the new SPMI IRQ controller. It
breaks as soon as patch 4 in this series (qcom: spmi-gpio: add support
for hierarchical IRQ chip) is applied but starts working again at patch
5 (ARM: dts: qcom: pm8941: add interrupt controller).

I'll respin this series this weekend with the temporary hack and drop it
later in the series. Sorry about the noise and thanks for the
reviewed-bys.

Brian
Stephen Boyd - Jan. 11, 2019, 11:39 p.m.
Quoting Brian Masney (2019-01-11 15:00:04)
> On Fri, Jan 11, 2019 at 02:07:09PM -0800, Stephen Boyd wrote:
> > Quoting Brian Masney (2019-01-09 17:12:54)
> > > Convert the spmi-pmic-arb IRQ code to use the version 2 IRQ interface
> > > in order to support hierarchical IRQ chips. This is necessary so that
> > > spmi-gpio can be setup as a hierarchical IRQ chip with pmic-arb as the
> > > parent. IRQ chips in device tree should be usable from the start without
> > > the consumer having to make an additional call to gpio[d]_to_irq() to
> > > get the proper IRQ on the parent. Driver was tested on a LG Nexus 5
> > > (hammerhead) phone.
> > > 
> > > Signed-off-by: Brian Masney <masneyb@onstation.org>
> > > ---
> > > Changes since v2:
> > > - None
> > > 
> > > Changes since v1:
> > > - Add intspec variable to qpnpint_irq_domain_translate to reduce the
> > >   overall diff.
> > > - Remove irq_domain_disassociate hack.
> > 
> > I thought we would need to keep that around? And then dispose of the
> > hack later on. Won't this just wreck the world almost immediately
> > because the MFD is counting irqs from DT?
> 
> We won't run into the issue with the MFD counting the IRQs since the
> interrupts property was removed and the interrupt-controller property
> was added to device tree in the same patch. The interrupts property that
> we ultimately don't need was the issue that I ran into with the MFD
> subsystem.
> 
> However to be certain, I retested and we need the temporary hack since
> pmic_gpio_to_irq in this series uses the new SPMI IRQ controller. It
> breaks as soon as patch 4 in this series (qcom: spmi-gpio: add support
> for hierarchical IRQ chip) is applied but starts working again at patch
> 5 (ARM: dts: qcom: pm8941: add interrupt controller).
> 
> I'll respin this series this weekend with the temporary hack and drop it
> later in the series. Sorry about the noise and thanks for the
> reviewed-bys.
> 

Ok sounds good. Can you also fix all the spmi-gpio specifying dts files?
There are more than just two PMIC dts files that need changes (per my
grep results sent to the list earlier).
Brian Masney - Jan. 12, 2019, 1:34 a.m.
On Fri, Jan 11, 2019 at 03:39:27PM -0800, Stephen Boyd wrote:
> Ok sounds good. Can you also fix all the spmi-gpio specifying dts files?
> There are more than just two PMIC dts files that need changes (per my
> grep results sent to the list earlier).

Yes, I'll take care of all of them in the next version.

Brian

Patch

diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c
index 360b8218f322..356bc3f66e22 100644
--- a/drivers/spmi/spmi-pmic-arb.c
+++ b/drivers/spmi/spmi-pmic-arb.c
@@ -666,7 +666,8 @@  static int qpnpint_get_irqchip_state(struct irq_data *d,
 	return 0;
 }
 
-static int qpnpint_irq_request_resources(struct irq_data *d)
+static int qpnpint_irq_domain_activate(struct irq_domain *domain,
+				       struct irq_data *d, bool reserve)
 {
 	struct spmi_pmic_arb *pmic_arb = irq_data_get_irq_chip_data(d);
 	u16 periph = hwirq_to_per(d->hwirq);
@@ -692,27 +693,25 @@  static struct irq_chip pmic_arb_irqchip = {
 	.irq_set_type	= qpnpint_irq_set_type,
 	.irq_set_wake	= qpnpint_irq_set_wake,
 	.irq_get_irqchip_state	= qpnpint_get_irqchip_state,
-	.irq_request_resources = qpnpint_irq_request_resources,
 	.flags		= IRQCHIP_MASK_ON_SUSPEND,
 };
 
-static int qpnpint_irq_domain_dt_translate(struct irq_domain *d,
-					   struct device_node *controller,
-					   const u32 *intspec,
-					   unsigned int intsize,
-					   unsigned long *out_hwirq,
-					   unsigned int *out_type)
+static int qpnpint_irq_domain_translate(struct irq_domain *d,
+					struct irq_fwspec *fwspec,
+					unsigned long *out_hwirq,
+					unsigned int *out_type)
 {
 	struct spmi_pmic_arb *pmic_arb = d->host_data;
+	u32 *intspec = fwspec->param;
 	u16 apid, ppid;
 	int rc;
 
 	dev_dbg(&pmic_arb->spmic->dev, "intspec[0] 0x%1x intspec[1] 0x%02x intspec[2] 0x%02x\n",
 		intspec[0], intspec[1], intspec[2]);
 
-	if (irq_domain_get_of_node(d) != controller)
+	if (irq_domain_get_of_node(d) != pmic_arb->spmic->dev.of_node)
 		return -EINVAL;
-	if (intsize != 4)
+	if (fwspec->param_count != 4)
 		return -EINVAL;
 	if (intspec[0] > 0xF || intspec[1] > 0xFF || intspec[2] > 0x7)
 		return -EINVAL;
@@ -740,17 +739,34 @@  static int qpnpint_irq_domain_dt_translate(struct irq_domain *d,
 	return 0;
 }
 
-static int qpnpint_irq_domain_map(struct irq_domain *d,
-				  unsigned int virq,
-				  irq_hw_number_t hwirq)
-{
-	struct spmi_pmic_arb *pmic_arb = d->host_data;
 
+static void qpnpint_irq_domain_map(struct spmi_pmic_arb *pmic_arb,
+				   struct irq_domain *domain, unsigned int virq,
+				   irq_hw_number_t hwirq)
+{
 	dev_dbg(&pmic_arb->spmic->dev, "virq = %u, hwirq = %lu\n", virq, hwirq);
 
-	irq_set_chip_and_handler(virq, &pmic_arb_irqchip, handle_level_irq);
-	irq_set_chip_data(virq, d->host_data);
-	irq_set_noprobe(virq);
+	irq_domain_set_info(domain, virq, hwirq, &pmic_arb_irqchip, pmic_arb,
+			    handle_level_irq, NULL, NULL);
+}
+
+static int qpnpint_irq_domain_alloc(struct irq_domain *domain,
+				    unsigned int virq, unsigned int nr_irqs,
+				    void *data)
+{
+	struct spmi_pmic_arb *pmic_arb = domain->host_data;
+	struct irq_fwspec *fwspec = data;
+	irq_hw_number_t hwirq;
+	unsigned int type;
+	int ret, i;
+
+	ret = qpnpint_irq_domain_translate(domain, fwspec, &hwirq, &type);
+	if (ret)
+		return ret;
+
+	for (i = 0; i < nr_irqs; i++)
+		qpnpint_irq_domain_map(pmic_arb, domain, virq + i, hwirq + i);
+
 	return 0;
 }
 
@@ -1126,8 +1142,10 @@  static const struct pmic_arb_ver_ops pmic_arb_v5 = {
 };
 
 static const struct irq_domain_ops pmic_arb_irq_domain_ops = {
-	.map	= qpnpint_irq_domain_map,
-	.xlate	= qpnpint_irq_domain_dt_translate,
+	.activate = qpnpint_irq_domain_activate,
+	.alloc = qpnpint_irq_domain_alloc,
+	.free = irq_domain_free_irqs_common,
+	.translate = qpnpint_irq_domain_translate,
 };
 
 static int spmi_pmic_arb_probe(struct platform_device *pdev)