diff mbox series

[v7,6/8] PCI: dwc: Add dw_pcie_host_ops.host_exit() callback

Message ID 1644992463-14467-7-git-send-email-hongxing.zhu@nxp.com (mailing list archive)
State Superseded
Headers show
Series PCI: imx6: refine codes and add compliance tests mode support | expand

Commit Message

Hongxing Zhu Feb. 16, 2022, 6:21 a.m. UTC
When link is never came up in the link training after host_init.
The clocks and power supplies usage counter balance should be handled
properly on some DWC platforms (for example, i.MX PCIe).

Add a new host_exit() callback into dw_pcie_host_ops, then it could be
invoked to handle the unbalance issue in the error handling after
host_init() function when link is down.

Signed-off-by: Richard Zhu <hongxing.zhu@nxp.com>
---
 drivers/pci/controller/dwc/pcie-designware-host.c | 5 ++++-
 drivers/pci/controller/dwc/pcie-designware.h      | 1 +
 2 files changed, 5 insertions(+), 1 deletion(-)

Comments

Bjorn Helgaas Feb. 23, 2022, 5:49 p.m. UTC | #1
On Wed, Feb 16, 2022 at 02:21:01PM +0800, Richard Zhu wrote:
> When link is never came up in the link training after host_init.
> The clocks and power supplies usage counter balance should be handled
> properly on some DWC platforms (for example, i.MX PCIe).
>
> Add a new host_exit() callback into dw_pcie_host_ops, then it could be
> invoked to handle the unbalance issue in the error handling after
> host_init() function when link is down.

Possible rewording, not sure if it captures everything you want:

  When the link never comes up after ->host_init(), some drivers,
  especially those that don't support hotplug, want to turn off clocks
  and power supplies.

  Add a new ->host_exit() callback in dw_pcie_host_ops so these
  drivers can clean up if ->host_init() fails.
Hongxing Zhu Feb. 24, 2022, 7:50 a.m. UTC | #2
> -----Original Message-----
> From: Bjorn Helgaas <helgaas@kernel.org>
> Sent: 2022年2月24日 1:50
> To: Hongxing Zhu <hongxing.zhu@nxp.com>
> Cc: l.stach@pengutronix.de; bhelgaas@google.com; broonie@kernel.org;
> lorenzo.pieralisi@arm.com; jingoohan1@gmail.com; festevam@gmail.com;
> francesco.dolcini@toradex.com; linux-pci@vger.kernel.org;
> linux-arm-kernel@lists.infradead.org; linux-kernel@vger.kernel.org;
> kernel@pengutronix.de; dl-linux-imx <linux-imx@nxp.com>
> Subject: Re: [PATCH v7 6/8] PCI: dwc: Add dw_pcie_host_ops.host_exit()
> callback
> 
> On Wed, Feb 16, 2022 at 02:21:01PM +0800, Richard Zhu wrote:
> > When link is never came up in the link training after host_init.
> > The clocks and power supplies usage counter balance should be handled
> > properly on some DWC platforms (for example, i.MX PCIe).
> >
> > Add a new host_exit() callback into dw_pcie_host_ops, then it could be
> > invoked to handle the unbalance issue in the error handling after
> > host_init() function when link is down.
> 
> Possible rewording, not sure if it captures everything you want:
> 
>   When the link never comes up after ->host_init(), some drivers,
>   especially those that don't support hotplug, want to turn off clocks
>   and power supplies.
> 
>   Add a new ->host_exit() callback in dw_pcie_host_ops so these
>   drivers can clean up if ->host_init() fails.

Thanks, it's more detailed, and easier understand. Would be updated later.

Best Regards
Richard Zhu
diff mbox series

Patch

diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
index f4755f3a03be..461863bde3c9 100644
--- a/drivers/pci/controller/dwc/pcie-designware-host.c
+++ b/drivers/pci/controller/dwc/pcie-designware-host.c
@@ -405,7 +405,7 @@  int dw_pcie_host_init(struct pcie_port *pp)
 	if (!dw_pcie_link_up(pci) && pci->ops && pci->ops->start_link) {
 		ret = pci->ops->start_link(pci);
 		if (ret)
-			goto err_free_msi;
+			goto err_host_init;
 	}
 
 	/* Ignore errors, the link may come up later */
@@ -417,6 +417,9 @@  int dw_pcie_host_init(struct pcie_port *pp)
 	if (!ret)
 		return 0;
 
+err_host_init:
+	if (pp->ops->host_exit)
+		pp->ops->host_exit(pp);
 err_free_msi:
 	if (pp->has_msi_ctrl)
 		dw_pcie_free_msi(pp);
diff --git a/drivers/pci/controller/dwc/pcie-designware.h b/drivers/pci/controller/dwc/pcie-designware.h
index 7d6e9b7576be..1153687ea9a6 100644
--- a/drivers/pci/controller/dwc/pcie-designware.h
+++ b/drivers/pci/controller/dwc/pcie-designware.h
@@ -174,6 +174,7 @@  enum dw_pcie_device_mode {
 
 struct dw_pcie_host_ops {
 	int (*host_init)(struct pcie_port *pp);
+	void (*host_exit)(struct pcie_port *pp);
 	int (*msi_host_init)(struct pcie_port *pp);
 };