All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Revert "PCI: aardvark: Rewrite IRQ code to chained IRQ handler"
@ 2022-05-15 12:58 ` Pali Rohár
  0 siblings, 0 replies; 4+ messages in thread
From: Pali Rohár @ 2022-05-15 12:58 UTC (permalink / raw)
  To: Bjorn Helgaas, Lorenzo Pieralisi
  Cc: Rob Herring, Krzysztof Wilczyński, Thomas Petazzoni,
	linux-pci, linux-arm-kernel, linux-kernel

This reverts commit 1571d67dc190e50c6c56e8f88cdc39f7cc53166e.

This commit broke support for setting interrupt affinity. It looks like
that it is related to the chained IRQ handler. Revert this commit until
issue with setting interrupt affinity is fixed.

Fixes: 1571d67dc190 ("PCI: aardvark: Rewrite IRQ code to chained IRQ handler")
Signed-off-by: Pali Rohár <pali@kernel.org>

---
This commit was introduced in v5.18-rc1 and hence it is regression for 5.18
release. After reverting this commit, it is possible to move aardvark
interrupt from CPU0 to CPU1 by "echo 2 > /proc/irq/XX/smp_affinity" where
XX is the interrupt number which can be find in /proc/interrupts on line
with advk-pcie.
---
 drivers/pci/controller/pci-aardvark.c | 48 ++++++++++++---------------
 1 file changed, 22 insertions(+), 26 deletions(-)

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 54651a1808cc..22ac607343bd 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -274,7 +274,6 @@ struct advk_pcie {
 		u32 actions;
 	} wins[OB_WIN_COUNT];
 	u8 wins_count;
-	int irq;
 	struct irq_domain *rp_irq_domain;
 	struct irq_domain *irq_domain;
 	struct irq_chip irq_chip;
@@ -1664,26 +1663,21 @@ static void advk_pcie_handle_int(struct advk_pcie *pcie)
 	}
 }
 
-static void advk_pcie_irq_handler(struct irq_desc *desc)
+static irqreturn_t advk_pcie_irq_handler(int irq, void *arg)
 {
-	struct advk_pcie *pcie = irq_desc_get_handler_data(desc);
-	struct irq_chip *chip = irq_desc_get_chip(desc);
-	u32 val, mask, status;
+	struct advk_pcie *pcie = arg;
+	u32 status;
 
-	chained_irq_enter(chip, desc);
+	status = advk_readl(pcie, HOST_CTRL_INT_STATUS_REG);
+	if (!(status & PCIE_IRQ_CORE_INT))
+		return IRQ_NONE;
 
-	val = advk_readl(pcie, HOST_CTRL_INT_STATUS_REG);
-	mask = advk_readl(pcie, HOST_CTRL_INT_MASK_REG);
-	status = val & ((~mask) & PCIE_IRQ_ALL_MASK);
+	advk_pcie_handle_int(pcie);
 
-	if (status & PCIE_IRQ_CORE_INT) {
-		advk_pcie_handle_int(pcie);
+	/* Clear interrupt */
+	advk_writel(pcie, PCIE_IRQ_CORE_INT, HOST_CTRL_INT_STATUS_REG);
 
-		/* Clear interrupt */
-		advk_writel(pcie, PCIE_IRQ_CORE_INT, HOST_CTRL_INT_STATUS_REG);
-	}
-
-	chained_irq_exit(chip, desc);
+	return IRQ_HANDLED;
 }
 
 static int advk_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
@@ -1763,7 +1757,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
 	struct advk_pcie *pcie;
 	struct pci_host_bridge *bridge;
 	struct resource_entry *entry;
-	int ret;
+	int ret, irq;
 
 	bridge = devm_pci_alloc_host_bridge(dev, sizeof(struct advk_pcie));
 	if (!bridge)
@@ -1849,9 +1843,17 @@ static int advk_pcie_probe(struct platform_device *pdev)
 	if (IS_ERR(pcie->base))
 		return PTR_ERR(pcie->base);
 
-	pcie->irq = platform_get_irq(pdev, 0);
-	if (pcie->irq < 0)
-		return pcie->irq;
+	irq = platform_get_irq(pdev, 0);
+	if (irq < 0)
+		return irq;
+
+	ret = devm_request_irq(dev, irq, advk_pcie_irq_handler,
+			       IRQF_SHARED | IRQF_NO_THREAD, "advk-pcie",
+			       pcie);
+	if (ret) {
+		dev_err(dev, "Failed to register interrupt\n");
+		return ret;
+	}
 
 	pcie->reset_gpio = devm_gpiod_get_from_of_node(dev, dev->of_node,
 						       "reset-gpios", 0,
@@ -1916,15 +1918,12 @@ static int advk_pcie_probe(struct platform_device *pdev)
 		return ret;
 	}
 
-	irq_set_chained_handler_and_data(pcie->irq, advk_pcie_irq_handler, pcie);
-
 	bridge->sysdata = pcie;
 	bridge->ops = &advk_pcie_ops;
 	bridge->map_irq = advk_pcie_map_irq;
 
 	ret = pci_host_probe(bridge);
 	if (ret < 0) {
-		irq_set_chained_handler_and_data(pcie->irq, NULL, NULL);
 		advk_pcie_remove_rp_irq_domain(pcie);
 		advk_pcie_remove_msi_irq_domain(pcie);
 		advk_pcie_remove_irq_domain(pcie);
@@ -1973,9 +1972,6 @@ static int advk_pcie_remove(struct platform_device *pdev)
 	advk_writel(pcie, PCIE_ISR1_ALL_MASK, PCIE_ISR1_REG);
 	advk_writel(pcie, PCIE_IRQ_ALL_MASK, HOST_CTRL_INT_STATUS_REG);
 
-	/* Remove IRQ handler */
-	irq_set_chained_handler_and_data(pcie->irq, NULL, NULL);
-
 	/* Remove IRQ domains */
 	advk_pcie_remove_rp_irq_domain(pcie);
 	advk_pcie_remove_msi_irq_domain(pcie);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH] Revert "PCI: aardvark: Rewrite IRQ code to chained IRQ handler"
@ 2022-05-15 12:58 ` Pali Rohár
  0 siblings, 0 replies; 4+ messages in thread
From: Pali Rohár @ 2022-05-15 12:58 UTC (permalink / raw)
  To: Bjorn Helgaas, Lorenzo Pieralisi
  Cc: Rob Herring, Krzysztof Wilczyński, Thomas Petazzoni,
	linux-pci, linux-arm-kernel, linux-kernel

This reverts commit 1571d67dc190e50c6c56e8f88cdc39f7cc53166e.

This commit broke support for setting interrupt affinity. It looks like
that it is related to the chained IRQ handler. Revert this commit until
issue with setting interrupt affinity is fixed.

Fixes: 1571d67dc190 ("PCI: aardvark: Rewrite IRQ code to chained IRQ handler")
Signed-off-by: Pali Rohár <pali@kernel.org>

---
This commit was introduced in v5.18-rc1 and hence it is regression for 5.18
release. After reverting this commit, it is possible to move aardvark
interrupt from CPU0 to CPU1 by "echo 2 > /proc/irq/XX/smp_affinity" where
XX is the interrupt number which can be find in /proc/interrupts on line
with advk-pcie.
---
 drivers/pci/controller/pci-aardvark.c | 48 ++++++++++++---------------
 1 file changed, 22 insertions(+), 26 deletions(-)

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 54651a1808cc..22ac607343bd 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -274,7 +274,6 @@ struct advk_pcie {
 		u32 actions;
 	} wins[OB_WIN_COUNT];
 	u8 wins_count;
-	int irq;
 	struct irq_domain *rp_irq_domain;
 	struct irq_domain *irq_domain;
 	struct irq_chip irq_chip;
@@ -1664,26 +1663,21 @@ static void advk_pcie_handle_int(struct advk_pcie *pcie)
 	}
 }
 
-static void advk_pcie_irq_handler(struct irq_desc *desc)
+static irqreturn_t advk_pcie_irq_handler(int irq, void *arg)
 {
-	struct advk_pcie *pcie = irq_desc_get_handler_data(desc);
-	struct irq_chip *chip = irq_desc_get_chip(desc);
-	u32 val, mask, status;
+	struct advk_pcie *pcie = arg;
+	u32 status;
 
-	chained_irq_enter(chip, desc);
+	status = advk_readl(pcie, HOST_CTRL_INT_STATUS_REG);
+	if (!(status & PCIE_IRQ_CORE_INT))
+		return IRQ_NONE;
 
-	val = advk_readl(pcie, HOST_CTRL_INT_STATUS_REG);
-	mask = advk_readl(pcie, HOST_CTRL_INT_MASK_REG);
-	status = val & ((~mask) & PCIE_IRQ_ALL_MASK);
+	advk_pcie_handle_int(pcie);
 
-	if (status & PCIE_IRQ_CORE_INT) {
-		advk_pcie_handle_int(pcie);
+	/* Clear interrupt */
+	advk_writel(pcie, PCIE_IRQ_CORE_INT, HOST_CTRL_INT_STATUS_REG);
 
-		/* Clear interrupt */
-		advk_writel(pcie, PCIE_IRQ_CORE_INT, HOST_CTRL_INT_STATUS_REG);
-	}
-
-	chained_irq_exit(chip, desc);
+	return IRQ_HANDLED;
 }
 
 static int advk_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
@@ -1763,7 +1757,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
 	struct advk_pcie *pcie;
 	struct pci_host_bridge *bridge;
 	struct resource_entry *entry;
-	int ret;
+	int ret, irq;
 
 	bridge = devm_pci_alloc_host_bridge(dev, sizeof(struct advk_pcie));
 	if (!bridge)
@@ -1849,9 +1843,17 @@ static int advk_pcie_probe(struct platform_device *pdev)
 	if (IS_ERR(pcie->base))
 		return PTR_ERR(pcie->base);
 
-	pcie->irq = platform_get_irq(pdev, 0);
-	if (pcie->irq < 0)
-		return pcie->irq;
+	irq = platform_get_irq(pdev, 0);
+	if (irq < 0)
+		return irq;
+
+	ret = devm_request_irq(dev, irq, advk_pcie_irq_handler,
+			       IRQF_SHARED | IRQF_NO_THREAD, "advk-pcie",
+			       pcie);
+	if (ret) {
+		dev_err(dev, "Failed to register interrupt\n");
+		return ret;
+	}
 
 	pcie->reset_gpio = devm_gpiod_get_from_of_node(dev, dev->of_node,
 						       "reset-gpios", 0,
@@ -1916,15 +1918,12 @@ static int advk_pcie_probe(struct platform_device *pdev)
 		return ret;
 	}
 
-	irq_set_chained_handler_and_data(pcie->irq, advk_pcie_irq_handler, pcie);
-
 	bridge->sysdata = pcie;
 	bridge->ops = &advk_pcie_ops;
 	bridge->map_irq = advk_pcie_map_irq;
 
 	ret = pci_host_probe(bridge);
 	if (ret < 0) {
-		irq_set_chained_handler_and_data(pcie->irq, NULL, NULL);
 		advk_pcie_remove_rp_irq_domain(pcie);
 		advk_pcie_remove_msi_irq_domain(pcie);
 		advk_pcie_remove_irq_domain(pcie);
@@ -1973,9 +1972,6 @@ static int advk_pcie_remove(struct platform_device *pdev)
 	advk_writel(pcie, PCIE_ISR1_ALL_MASK, PCIE_ISR1_REG);
 	advk_writel(pcie, PCIE_IRQ_ALL_MASK, HOST_CTRL_INT_STATUS_REG);
 
-	/* Remove IRQ handler */
-	irq_set_chained_handler_and_data(pcie->irq, NULL, NULL);
-
 	/* Remove IRQ domains */
 	advk_pcie_remove_rp_irq_domain(pcie);
 	advk_pcie_remove_msi_irq_domain(pcie);
-- 
2.20.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] Revert "PCI: aardvark: Rewrite IRQ code to chained IRQ handler"
  2022-05-15 12:58 ` Pali Rohár
@ 2022-05-16 20:59   ` Bjorn Helgaas
  -1 siblings, 0 replies; 4+ messages in thread
From: Bjorn Helgaas @ 2022-05-16 20:59 UTC (permalink / raw)
  To: Pali Rohár
  Cc: Bjorn Helgaas, Lorenzo Pieralisi, Rob Herring,
	Krzysztof Wilczyński, Thomas Petazzoni, linux-pci,
	linux-arm-kernel, linux-kernel

On Sun, May 15, 2022 at 02:58:15PM +0200, Pali Rohár wrote:
> This reverts commit 1571d67dc190e50c6c56e8f88cdc39f7cc53166e.
> 
> This commit broke support for setting interrupt affinity. It looks like
> that it is related to the chained IRQ handler. Revert this commit until
> issue with setting interrupt affinity is fixed.
> 
> Fixes: 1571d67dc190 ("PCI: aardvark: Rewrite IRQ code to chained IRQ handler")
> Signed-off-by: Pali Rohár <pali@kernel.org>
> 
> ---
> This commit was introduced in v5.18-rc1 and hence it is regression for 5.18
> release. After reverting this commit, it is possible to move aardvark
> interrupt from CPU0 to CPU1 by "echo 2 > /proc/irq/XX/smp_affinity" where
> XX is the interrupt number which can be find in /proc/interrupts on line
> with advk-pcie.

Applied to for-linus for v5.18, thanks, Pali!

> ---
>  drivers/pci/controller/pci-aardvark.c | 48 ++++++++++++---------------
>  1 file changed, 22 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
> index 54651a1808cc..22ac607343bd 100644
> --- a/drivers/pci/controller/pci-aardvark.c
> +++ b/drivers/pci/controller/pci-aardvark.c
> @@ -274,7 +274,6 @@ struct advk_pcie {
>  		u32 actions;
>  	} wins[OB_WIN_COUNT];
>  	u8 wins_count;
> -	int irq;
>  	struct irq_domain *rp_irq_domain;
>  	struct irq_domain *irq_domain;
>  	struct irq_chip irq_chip;
> @@ -1664,26 +1663,21 @@ static void advk_pcie_handle_int(struct advk_pcie *pcie)
>  	}
>  }
>  
> -static void advk_pcie_irq_handler(struct irq_desc *desc)
> +static irqreturn_t advk_pcie_irq_handler(int irq, void *arg)
>  {
> -	struct advk_pcie *pcie = irq_desc_get_handler_data(desc);
> -	struct irq_chip *chip = irq_desc_get_chip(desc);
> -	u32 val, mask, status;
> +	struct advk_pcie *pcie = arg;
> +	u32 status;
>  
> -	chained_irq_enter(chip, desc);
> +	status = advk_readl(pcie, HOST_CTRL_INT_STATUS_REG);
> +	if (!(status & PCIE_IRQ_CORE_INT))
> +		return IRQ_NONE;
>  
> -	val = advk_readl(pcie, HOST_CTRL_INT_STATUS_REG);
> -	mask = advk_readl(pcie, HOST_CTRL_INT_MASK_REG);
> -	status = val & ((~mask) & PCIE_IRQ_ALL_MASK);
> +	advk_pcie_handle_int(pcie);
>  
> -	if (status & PCIE_IRQ_CORE_INT) {
> -		advk_pcie_handle_int(pcie);
> +	/* Clear interrupt */
> +	advk_writel(pcie, PCIE_IRQ_CORE_INT, HOST_CTRL_INT_STATUS_REG);
>  
> -		/* Clear interrupt */
> -		advk_writel(pcie, PCIE_IRQ_CORE_INT, HOST_CTRL_INT_STATUS_REG);
> -	}
> -
> -	chained_irq_exit(chip, desc);
> +	return IRQ_HANDLED;
>  }
>  
>  static int advk_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
> @@ -1763,7 +1757,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
>  	struct advk_pcie *pcie;
>  	struct pci_host_bridge *bridge;
>  	struct resource_entry *entry;
> -	int ret;
> +	int ret, irq;
>  
>  	bridge = devm_pci_alloc_host_bridge(dev, sizeof(struct advk_pcie));
>  	if (!bridge)
> @@ -1849,9 +1843,17 @@ static int advk_pcie_probe(struct platform_device *pdev)
>  	if (IS_ERR(pcie->base))
>  		return PTR_ERR(pcie->base);
>  
> -	pcie->irq = platform_get_irq(pdev, 0);
> -	if (pcie->irq < 0)
> -		return pcie->irq;
> +	irq = platform_get_irq(pdev, 0);
> +	if (irq < 0)
> +		return irq;
> +
> +	ret = devm_request_irq(dev, irq, advk_pcie_irq_handler,
> +			       IRQF_SHARED | IRQF_NO_THREAD, "advk-pcie",
> +			       pcie);
> +	if (ret) {
> +		dev_err(dev, "Failed to register interrupt\n");
> +		return ret;
> +	}
>  
>  	pcie->reset_gpio = devm_gpiod_get_from_of_node(dev, dev->of_node,
>  						       "reset-gpios", 0,
> @@ -1916,15 +1918,12 @@ static int advk_pcie_probe(struct platform_device *pdev)
>  		return ret;
>  	}
>  
> -	irq_set_chained_handler_and_data(pcie->irq, advk_pcie_irq_handler, pcie);
> -
>  	bridge->sysdata = pcie;
>  	bridge->ops = &advk_pcie_ops;
>  	bridge->map_irq = advk_pcie_map_irq;
>  
>  	ret = pci_host_probe(bridge);
>  	if (ret < 0) {
> -		irq_set_chained_handler_and_data(pcie->irq, NULL, NULL);
>  		advk_pcie_remove_rp_irq_domain(pcie);
>  		advk_pcie_remove_msi_irq_domain(pcie);
>  		advk_pcie_remove_irq_domain(pcie);
> @@ -1973,9 +1972,6 @@ static int advk_pcie_remove(struct platform_device *pdev)
>  	advk_writel(pcie, PCIE_ISR1_ALL_MASK, PCIE_ISR1_REG);
>  	advk_writel(pcie, PCIE_IRQ_ALL_MASK, HOST_CTRL_INT_STATUS_REG);
>  
> -	/* Remove IRQ handler */
> -	irq_set_chained_handler_and_data(pcie->irq, NULL, NULL);
> -
>  	/* Remove IRQ domains */
>  	advk_pcie_remove_rp_irq_domain(pcie);
>  	advk_pcie_remove_msi_irq_domain(pcie);
> -- 
> 2.20.1
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Revert "PCI: aardvark: Rewrite IRQ code to chained IRQ handler"
@ 2022-05-16 20:59   ` Bjorn Helgaas
  0 siblings, 0 replies; 4+ messages in thread
From: Bjorn Helgaas @ 2022-05-16 20:59 UTC (permalink / raw)
  To: Pali Rohár
  Cc: Bjorn Helgaas, Lorenzo Pieralisi, Rob Herring,
	Krzysztof Wilczyński, Thomas Petazzoni, linux-pci,
	linux-arm-kernel, linux-kernel

On Sun, May 15, 2022 at 02:58:15PM +0200, Pali Rohár wrote:
> This reverts commit 1571d67dc190e50c6c56e8f88cdc39f7cc53166e.
> 
> This commit broke support for setting interrupt affinity. It looks like
> that it is related to the chained IRQ handler. Revert this commit until
> issue with setting interrupt affinity is fixed.
> 
> Fixes: 1571d67dc190 ("PCI: aardvark: Rewrite IRQ code to chained IRQ handler")
> Signed-off-by: Pali Rohár <pali@kernel.org>
> 
> ---
> This commit was introduced in v5.18-rc1 and hence it is regression for 5.18
> release. After reverting this commit, it is possible to move aardvark
> interrupt from CPU0 to CPU1 by "echo 2 > /proc/irq/XX/smp_affinity" where
> XX is the interrupt number which can be find in /proc/interrupts on line
> with advk-pcie.

Applied to for-linus for v5.18, thanks, Pali!

> ---
>  drivers/pci/controller/pci-aardvark.c | 48 ++++++++++++---------------
>  1 file changed, 22 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
> index 54651a1808cc..22ac607343bd 100644
> --- a/drivers/pci/controller/pci-aardvark.c
> +++ b/drivers/pci/controller/pci-aardvark.c
> @@ -274,7 +274,6 @@ struct advk_pcie {
>  		u32 actions;
>  	} wins[OB_WIN_COUNT];
>  	u8 wins_count;
> -	int irq;
>  	struct irq_domain *rp_irq_domain;
>  	struct irq_domain *irq_domain;
>  	struct irq_chip irq_chip;
> @@ -1664,26 +1663,21 @@ static void advk_pcie_handle_int(struct advk_pcie *pcie)
>  	}
>  }
>  
> -static void advk_pcie_irq_handler(struct irq_desc *desc)
> +static irqreturn_t advk_pcie_irq_handler(int irq, void *arg)
>  {
> -	struct advk_pcie *pcie = irq_desc_get_handler_data(desc);
> -	struct irq_chip *chip = irq_desc_get_chip(desc);
> -	u32 val, mask, status;
> +	struct advk_pcie *pcie = arg;
> +	u32 status;
>  
> -	chained_irq_enter(chip, desc);
> +	status = advk_readl(pcie, HOST_CTRL_INT_STATUS_REG);
> +	if (!(status & PCIE_IRQ_CORE_INT))
> +		return IRQ_NONE;
>  
> -	val = advk_readl(pcie, HOST_CTRL_INT_STATUS_REG);
> -	mask = advk_readl(pcie, HOST_CTRL_INT_MASK_REG);
> -	status = val & ((~mask) & PCIE_IRQ_ALL_MASK);
> +	advk_pcie_handle_int(pcie);
>  
> -	if (status & PCIE_IRQ_CORE_INT) {
> -		advk_pcie_handle_int(pcie);
> +	/* Clear interrupt */
> +	advk_writel(pcie, PCIE_IRQ_CORE_INT, HOST_CTRL_INT_STATUS_REG);
>  
> -		/* Clear interrupt */
> -		advk_writel(pcie, PCIE_IRQ_CORE_INT, HOST_CTRL_INT_STATUS_REG);
> -	}
> -
> -	chained_irq_exit(chip, desc);
> +	return IRQ_HANDLED;
>  }
>  
>  static int advk_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
> @@ -1763,7 +1757,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
>  	struct advk_pcie *pcie;
>  	struct pci_host_bridge *bridge;
>  	struct resource_entry *entry;
> -	int ret;
> +	int ret, irq;
>  
>  	bridge = devm_pci_alloc_host_bridge(dev, sizeof(struct advk_pcie));
>  	if (!bridge)
> @@ -1849,9 +1843,17 @@ static int advk_pcie_probe(struct platform_device *pdev)
>  	if (IS_ERR(pcie->base))
>  		return PTR_ERR(pcie->base);
>  
> -	pcie->irq = platform_get_irq(pdev, 0);
> -	if (pcie->irq < 0)
> -		return pcie->irq;
> +	irq = platform_get_irq(pdev, 0);
> +	if (irq < 0)
> +		return irq;
> +
> +	ret = devm_request_irq(dev, irq, advk_pcie_irq_handler,
> +			       IRQF_SHARED | IRQF_NO_THREAD, "advk-pcie",
> +			       pcie);
> +	if (ret) {
> +		dev_err(dev, "Failed to register interrupt\n");
> +		return ret;
> +	}
>  
>  	pcie->reset_gpio = devm_gpiod_get_from_of_node(dev, dev->of_node,
>  						       "reset-gpios", 0,
> @@ -1916,15 +1918,12 @@ static int advk_pcie_probe(struct platform_device *pdev)
>  		return ret;
>  	}
>  
> -	irq_set_chained_handler_and_data(pcie->irq, advk_pcie_irq_handler, pcie);
> -
>  	bridge->sysdata = pcie;
>  	bridge->ops = &advk_pcie_ops;
>  	bridge->map_irq = advk_pcie_map_irq;
>  
>  	ret = pci_host_probe(bridge);
>  	if (ret < 0) {
> -		irq_set_chained_handler_and_data(pcie->irq, NULL, NULL);
>  		advk_pcie_remove_rp_irq_domain(pcie);
>  		advk_pcie_remove_msi_irq_domain(pcie);
>  		advk_pcie_remove_irq_domain(pcie);
> @@ -1973,9 +1972,6 @@ static int advk_pcie_remove(struct platform_device *pdev)
>  	advk_writel(pcie, PCIE_ISR1_ALL_MASK, PCIE_ISR1_REG);
>  	advk_writel(pcie, PCIE_IRQ_ALL_MASK, HOST_CTRL_INT_STATUS_REG);
>  
> -	/* Remove IRQ handler */
> -	irq_set_chained_handler_and_data(pcie->irq, NULL, NULL);
> -
>  	/* Remove IRQ domains */
>  	advk_pcie_remove_rp_irq_domain(pcie);
>  	advk_pcie_remove_msi_irq_domain(pcie);
> -- 
> 2.20.1
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-05-16 21:12 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-15 12:58 [PATCH] Revert "PCI: aardvark: Rewrite IRQ code to chained IRQ handler" Pali Rohár
2022-05-15 12:58 ` Pali Rohár
2022-05-16 20:59 ` Bjorn Helgaas
2022-05-16 20:59   ` Bjorn Helgaas

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.