[PATCH 1/2] PCI: dwc: Handle return value from endpoint .init callback

Frank Li Frank.li at oss.nxp.com
Tue Jul 28 12:11:46 PDT 2026


On Tue, Jul 28, 2026 at 03:24:24AM +0200, Marek Vasut wrote:
> Add return value handling for struct dw_pcie_ep_ops .init callback.
>
> Signed-off-by: Marek Vasut <marek.vasut+renesas at mailbox.org>
> ---
> Cc: "Krzysztof Wilczyński" <kwilczynski at kernel.org>
> Cc: Anand Moon <linux.amoon at gmail.com>
> Cc: Bjorn Helgaas <bhelgaas at google.com>
> Cc: Frank Li <Frank.Li at nxp.com>
> Cc: Geert Uytterhoeven <geert+renesas at glider.be>
> Cc: Heiko Stuebner <heiko at sntech.de>
> Cc: Jesper Nilsson <jesper.nilsson at axis.com>
> Cc: Jingoo Han <jingoohan1 at gmail.com>
> Cc: Koichiro Den <den at valinux.co.jp>
> Cc: Lorenzo Pieralisi <lpieralisi at kernel.org>
> Cc: Magnus Damm <magnus.damm at gmail.com>
> Cc: Manivannan Sadhasivam <mani at kernel.org>
> Cc: Minghuan Lian <minghuan.Lian at nxp.com>
> Cc: Mingkai Hu <mingkai.hu at nxp.com>
> Cc: Nicolas Frattaroli <nicolas.frattaroli at collabora.com>
> Cc: Niklas Cassel <cassel at kernel.org>
> Cc: Qianfeng Rong <rongqianfeng at vivo.com>
> Cc: Qiang Yu <qiang.yu at oss.qualcomm.com>
> Cc: Rob Herring <robh at kernel.org>
> Cc: Roy Zang <roy.zang at nxp.com>
> Cc: Shawn Lin <shawn.lin at rock-chips.com>
> Cc: Siddharth Vadapalli <s-vadapalli at ti.com>
> Cc: Srikanth Thokala <srikanth.thokala at intel.com>
> Cc: Vignesh Raghavendra <vigneshr at ti.com>
> Cc: Yoshihiro Shimoda <yoshihiro.shimoda.uh at renesas.com>
> Cc: Yuho Choi <dbgh9129 at gmail.com>
> Cc: imx at lists.linux.dev
> Cc: linux-arm-kernel at lists.infradead.org
> Cc: linux-kernel at vger.kernel.org
> Cc: linux-omap at vger.kernel.org
> Cc: linux-pci at vger.kernel.org
> Cc: linux-renesas-soc at vger.kernel.org
> Cc: linux-rockchip at lists.infradead.org
> ---
>  drivers/pci/controller/dwc/pci-dra7xx.c         | 4 +++-
>  drivers/pci/controller/dwc/pci-keystone.c       | 4 +++-
>  drivers/pci/controller/dwc/pci-layerscape-ep.c  | 6 ++++--
>  drivers/pci/controller/dwc/pcie-artpec6.c       | 4 +++-
>  drivers/pci/controller/dwc/pcie-designware-ep.c | 7 +++++--
>  drivers/pci/controller/dwc/pcie-designware.h    | 2 +-
>  drivers/pci/controller/dwc/pcie-dw-rockchip.c   | 4 +++-
>  drivers/pci/controller/dwc/pcie-keembay.c       | 4 +++-
>  8 files changed, 25 insertions(+), 10 deletions(-)

Reviewed-by: Frank Li <Frank.Li at nxp.com>

>
> diff --git a/drivers/pci/controller/dwc/pci-dra7xx.c b/drivers/pci/controller/dwc/pci-dra7xx.c
> index 3fc889944f021..6ae5b27e27b32 100644
> --- a/drivers/pci/controller/dwc/pci-dra7xx.c
> +++ b/drivers/pci/controller/dwc/pci-dra7xx.c
> @@ -373,12 +373,14 @@ static const struct dw_pcie_host_ops dra7xx_pcie_host_ops = {
>  	.init = dra7xx_pcie_host_init,
>  };
>
> -static void dra7xx_pcie_ep_init(struct dw_pcie_ep *ep)
> +static int dra7xx_pcie_ep_init(struct dw_pcie_ep *ep)
>  {
>  	struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
>  	struct dra7xx_pcie *dra7xx = to_dra7xx_pcie(pci);
>
>  	dra7xx_pcie_enable_wrapper_interrupts(dra7xx);
> +
> +	return 0;
>  }
>
>  static void dra7xx_pcie_raise_intx_irq(struct dra7xx_pcie *dra7xx)
> diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c
> index f1b27aed488de..602516239a573 100644
> --- a/drivers/pci/controller/dwc/pci-keystone.c
> +++ b/drivers/pci/controller/dwc/pci-keystone.c
> @@ -876,7 +876,7 @@ static const struct dw_pcie_ops ks_pcie_dw_pcie_ops = {
>  	.write_dbi2 = ks_pcie_am654_write_dbi2,
>  };
>
> -static void ks_pcie_am654_ep_init(struct dw_pcie_ep *ep)
> +static int ks_pcie_am654_ep_init(struct dw_pcie_ep *ep)
>  {
>  	struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
>  	int flags;
> @@ -885,6 +885,8 @@ static void ks_pcie_am654_ep_init(struct dw_pcie_ep *ep)
>  	flags = PCI_BASE_ADDRESS_SPACE_MEMORY | PCI_BASE_ADDRESS_MEM_TYPE_32;
>  	dw_pcie_writel_dbi2(pci, PCI_BASE_ADDRESS_0, APP_ADDR_SPACE_0 - 1);
>  	dw_pcie_writel_dbi(pci, PCI_BASE_ADDRESS_0, flags);
> +
> +	return 0;
>  }
>
>  static void ks_pcie_am654_raise_intx_irq(struct keystone_pcie *ks_pcie)
> diff --git a/drivers/pci/controller/dwc/pci-layerscape-ep.c b/drivers/pci/controller/dwc/pci-layerscape-ep.c
> index 8936975ff104e..527c57114dcfe 100644
> --- a/drivers/pci/controller/dwc/pci-layerscape-ep.c
> +++ b/drivers/pci/controller/dwc/pci-layerscape-ep.c
> @@ -147,7 +147,7 @@ ls_pcie_ep_get_features(struct dw_pcie_ep *ep)
>  	return pcie->ls_epc;
>  }
>
> -static void ls_pcie_ep_init(struct dw_pcie_ep *ep)
> +static int ls_pcie_ep_init(struct dw_pcie_ep *ep)
>  {
>  	struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
>  	struct ls_pcie_ep *pcie = to_ls_pcie_ep(pci);
> @@ -155,10 +155,12 @@ static void ls_pcie_ep_init(struct dw_pcie_ep *ep)
>
>  	ep_func = dw_pcie_ep_get_func_from_ep(ep, 0);
>  	if (!ep_func)
> -		return;
> +		return -ENODEV;
>
>  	pcie->ls_epc->msi_capable = ep_func->msi_cap ? true : false;
>  	pcie->ls_epc->msix_capable = ep_func->msix_cap ? true : false;
> +
> +	return 0;
>  }
>
>  static int ls_pcie_ep_raise_irq(struct dw_pcie_ep *ep, u8 func_no,
> diff --git a/drivers/pci/controller/dwc/pcie-artpec6.c b/drivers/pci/controller/dwc/pcie-artpec6.c
> index 5cd227dda9a10..7f0ba506dd1cf 100644
> --- a/drivers/pci/controller/dwc/pcie-artpec6.c
> +++ b/drivers/pci/controller/dwc/pcie-artpec6.c
> @@ -335,7 +335,7 @@ static const struct dw_pcie_host_ops artpec6_pcie_host_ops = {
>  	.init = artpec6_pcie_host_init,
>  };
>
> -static void artpec6_pcie_ep_init(struct dw_pcie_ep *ep)
> +static int artpec6_pcie_ep_init(struct dw_pcie_ep *ep)
>  {
>  	struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
>  	struct artpec6_pcie *artpec6_pcie = to_artpec6_pcie(pci);
> @@ -344,6 +344,8 @@ static void artpec6_pcie_ep_init(struct dw_pcie_ep *ep)
>  	artpec6_pcie_init_phy(artpec6_pcie);
>  	artpec6_pcie_deassert_core_reset(artpec6_pcie);
>  	artpec6_pcie_wait_for_phy(artpec6_pcie);
> +
> +	return 0;
>  }
>
>  static int artpec6_pcie_raise_irq(struct dw_pcie_ep *ep, u8 func_no,
> diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c
> index 7d2794945704e..d78fb845582b2 100644
> --- a/drivers/pci/controller/dwc/pcie-designware-ep.c
> +++ b/drivers/pci/controller/dwc/pcie-designware-ep.c
> @@ -1367,8 +1367,11 @@ int dw_pcie_ep_init_registers(struct dw_pcie_ep *ep)
>  		list_add_tail(&ep_func->list, &ep->func_list);
>  	}
>
> -	if (ep->ops->init)
> -		ep->ops->init(ep);
> +	if (ep->ops->init) {
> +		ret = ep->ops->init(ep);
> +		if (ret)
> +			goto err_remove_edma;
> +	}
>
>  	dw_pcie_ep_disable_bars(ep);
>
> diff --git a/drivers/pci/controller/dwc/pcie-designware.h b/drivers/pci/controller/dwc/pcie-designware.h
> index de4b245b1758c..004b433f17135 100644
> --- a/drivers/pci/controller/dwc/pcie-designware.h
> +++ b/drivers/pci/controller/dwc/pcie-designware.h
> @@ -475,7 +475,7 @@ struct dw_pcie_rp {
>
>  struct dw_pcie_ep_ops {
>  	void	(*pre_init)(struct dw_pcie_ep *ep);
> -	void	(*init)(struct dw_pcie_ep *ep);
> +	int	(*init)(struct dw_pcie_ep *ep);
>  	int	(*raise_irq)(struct dw_pcie_ep *ep, u8 func_no,
>  			     unsigned int type, u16 interrupt_num);
>  	const struct pci_epc_features* (*get_features)(struct dw_pcie_ep *ep);
> diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> index 731d93663ccae..bd5d1a2472a40 100644
> --- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> +++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> @@ -469,12 +469,14 @@ static void rockchip_pcie_ep_hide_broken_ats_cap_rk3588(struct dw_pcie_ep *ep)
>  	dw_pcie_remove_ext_capability(pci, PCI_EXT_CAP_ID_ATS);
>  }
>
> -static void rockchip_pcie_ep_init(struct dw_pcie_ep *ep)
> +static int rockchip_pcie_ep_init(struct dw_pcie_ep *ep)
>  {
>  	struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
>
>  	rockchip_pcie_enable_l0s(pci);
>  	rockchip_pcie_ep_hide_broken_ats_cap_rk3588(ep);
> +
> +	return 0;
>  };
>
>  static int rockchip_pcie_raise_irq(struct dw_pcie_ep *ep, u8 func_no,
> diff --git a/drivers/pci/controller/dwc/pcie-keembay.c b/drivers/pci/controller/dwc/pcie-keembay.c
> index 42fb5f24a2230..b11e66c10fffa 100644
> --- a/drivers/pci/controller/dwc/pcie-keembay.c
> +++ b/drivers/pci/controller/dwc/pcie-keembay.c
> @@ -278,12 +278,14 @@ static int keembay_pcie_setup_msi_irq(struct keembay_pcie *pcie)
>  	return 0;
>  }
>
> -static void keembay_pcie_ep_init(struct dw_pcie_ep *ep)
> +static int keembay_pcie_ep_init(struct dw_pcie_ep *ep)
>  {
>  	struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
>  	struct keembay_pcie *pcie = dev_get_drvdata(pci->dev);
>
>  	writel(EDMA_INT_EN, pcie->apb_base + PCIE_REGS_INTERRUPT_ENABLE);
> +
> +	return 0;
>  }
>
>  static int keembay_pcie_ep_raise_irq(struct dw_pcie_ep *ep, u8 func_no,
> --
> 2.53.0
>



More information about the Linux-rockchip mailing list