Re: [PATCH v4 6/8] PCI: rzg3s-host: Move IRQ domain setup code

From: Lad, Prabhakar

Date: Thu Sep 24 2026 - 08:32:26 EST


On Tue, Sep 22, 2026 at 3:54 PM Claudiu Beznea
<claudiu.beznea@xxxxxxxxxx> wrote:
>
> From: Claudiu Beznea <claudiu.beznea.uj@xxxxxxxxxxxxxx>
>
> Subsequent patches add support for the event IRQ to handle link
> up/down events. The event IRQ handler will use
> rzg3s_pcie_set_max_link_speed(). In preparation for adding event IRQ
> support, move the IRQ domain initialization code after
> rzg3s_pcie_set_max_link_speed().
>
> Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@xxxxxxxxxxxxxx>
> ---
>
> Changes in v4:
> - none
>
> Changes in v3:
> - none, this patch is new
>
> drivers/pci/controller/pcie-rzg3s-host.c | 147 +++++++++++------------
> 1 file changed, 73 insertions(+), 74 deletions(-)
>
Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@xxxxxxxxxxxxxx>
Tested-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@xxxxxxxxxxxxxx>

Cheers,
Prabhakar

> diff --git a/drivers/pci/controller/pcie-rzg3s-host.c b/drivers/pci/controller/pcie-rzg3s-host.c
> index 40d5ef3e347e..f4b27a77a89d 100644
> --- a/drivers/pci/controller/pcie-rzg3s-host.c
> +++ b/drivers/pci/controller/pcie-rzg3s-host.c
> @@ -1006,80 +1006,6 @@ static const struct irq_domain_ops rzg3s_pcie_intx_domain_ops = {
> .xlate = irq_domain_xlate_onetwocell,
> };
>
> -static void rzg3s_pcie_teardown_intx(struct rzg3s_pcie_host *host,
> - int count)
> -{
> - while (--count >= 0) {
> - irq_set_chained_handler_and_data(host->intx_irqs[count], NULL,
> - NULL);
> - }
> -
> - if (host->intx_domain)
> - irq_domain_remove(host->intx_domain);
> -}
> -
> -static int rzg3s_pcie_init_irqdomain(struct rzg3s_pcie_host *host)
> -{
> - struct device *dev = host->dev;
> - struct platform_device *pdev = to_platform_device(dev);
> - int i, ret;
> -
> - for (i = 0; i < PCI_NUM_INTX; i++) {
> - char irq_name[5] = {0};
> - int irq;
> -
> - scnprintf(irq_name, ARRAY_SIZE(irq_name), "int%c", 'a' + i);
> -
> - irq = platform_get_irq_byname(pdev, irq_name);
> - if (irq < 0) {
> - ret = irq;
> - dev_err_probe(dev, ret,
> - "Failed to parse and map INT%c IRQ\n",
> - 'A' + i);
> - goto teardown_intx;
> - }
> -
> - host->intx_irqs[i] = irq;
> - irq_set_chained_handler_and_data(irq,
> - rzg3s_pcie_intx_irq_handler,
> - host);
> - }
> -
> - host->intx_domain = irq_domain_create_linear(dev_fwnode(dev),
> - PCI_NUM_INTX,
> - &rzg3s_pcie_intx_domain_ops,
> - host);
> - if (!host->intx_domain) {
> - ret = -EINVAL;
> - dev_err_probe(dev, ret,
> - "Failed to add irq domain for INTx IRQs\n");
> - goto teardown_intx;
> - }
> - irq_domain_update_bus_token(host->intx_domain, DOMAIN_BUS_WIRED);
> -
> - if (IS_ENABLED(CONFIG_PCI_MSI)) {
> - ret = rzg3s_pcie_init_msi(host);
> -
> - if (ret)
> - goto teardown_intx;
> - }
> -
> - return 0;
> -
> -teardown_intx:
> - rzg3s_pcie_teardown_intx(host, i);
> -
> - return ret;
> -}
> -
> -static void rzg3s_pcie_teardown_irqdomain(struct rzg3s_pcie_host *host)
> -{
> - if (IS_ENABLED(CONFIG_PCI_MSI))
> - rzg3s_pcie_teardown_msi(host);
> -
> - rzg3s_pcie_teardown_intx(host, PCI_NUM_INTX);
> -}
> -
> static int rzg3s_pcie_set_max_link_speed(struct rzg3s_pcie_host *host)
> {
> u32 remote_supported_link_speeds, max_supported_link_speeds;
> @@ -1169,6 +1095,79 @@ static int rzg3s_pcie_set_max_link_speed(struct rzg3s_pcie_host *host)
> return ret;
> }
>
> +static void rzg3s_pcie_teardown_intx(struct rzg3s_pcie_host *host, int count)
> +{
> + if (host->intx_domain)
> + irq_domain_remove(host->intx_domain);
> +
> + while (--count >= 0) {
> + irq_set_chained_handler_and_data(host->intx_irqs[count], NULL,
> + NULL);
> + }
> +}
> +
> +static int rzg3s_pcie_init_irqdomain(struct rzg3s_pcie_host *host)
> +{
> + struct device *dev = host->dev;
> + struct platform_device *pdev = to_platform_device(dev);
> + int i, ret;
> +
> + for (i = 0; i < PCI_NUM_INTX; i++) {
> + char irq_name[5] = {0};
> + int irq;
> +
> + scnprintf(irq_name, ARRAY_SIZE(irq_name), "int%c", 'a' + i);
> +
> + irq = platform_get_irq_byname(pdev, irq_name);
> + if (irq < 0) {
> + ret = irq;
> + dev_err_probe(dev, ret,
> + "Failed to parse and map INT%c IRQ\n",
> + 'A' + i);
> + goto teardown_intx;
> + }
> +
> + host->intx_irqs[i] = irq;
> + irq_set_chained_handler_and_data(irq,
> + rzg3s_pcie_intx_irq_handler,
> + host);
> + }
> +
> + host->intx_domain = irq_domain_create_linear(dev_fwnode(dev),
> + PCI_NUM_INTX,
> + &rzg3s_pcie_intx_domain_ops,
> + host);
> + if (!host->intx_domain) {
> + ret = -EINVAL;
> + dev_err_probe(dev, ret,
> + "Failed to add irq domain for INTx IRQs\n");
> + goto teardown_intx;
> + }
> + irq_domain_update_bus_token(host->intx_domain, DOMAIN_BUS_WIRED);
> +
> + if (IS_ENABLED(CONFIG_PCI_MSI)) {
> + ret = rzg3s_pcie_init_msi(host);
> +
> + if (ret)
> + goto teardown_intx;
> + }
> +
> + return 0;
> +
> +teardown_intx:
> + rzg3s_pcie_teardown_intx(host, i);
> +
> + return ret;
> +}
> +
> +static void rzg3s_pcie_teardown_irqdomain(struct rzg3s_pcie_host *host)
> +{
> + if (IS_ENABLED(CONFIG_PCI_MSI))
> + rzg3s_pcie_teardown_msi(host);
> +
> + rzg3s_pcie_teardown_intx(host, PCI_NUM_INTX);
> +}
> +
> static int rzg3s_pcie_config_init(struct rzg3s_pcie_host *host)
> {
> struct pci_host_bridge *bridge = pci_host_bridge_from_priv(host);
> --
> 2.43.0
>
>