diff mbox series

[v10,2/4] PCI: mediatek: Add new method to get shared pcie-cfg base address and parse node

Message ID 20210611060902.12418-3-chuanjia.liu@mediatek.com
State Superseded
Headers show
Series [v10,1/4] dt-bindings: PCI: mediatek: Update the Device tree bindings | expand

Commit Message

Chuanjia Liu June 11, 2021, 6:09 a.m. UTC
For the new dts format, add a new method to get
shared pcie-cfg base address and parse node.

Signed-off-by: Chuanjia Liu <chuanjia.liu@mediatek.com>
Acked-by: Ryder Lee <ryder.lee@mediatek.com>
---
 drivers/pci/controller/pcie-mediatek.c | 52 +++++++++++++++++++-------
 1 file changed, 39 insertions(+), 13 deletions(-)

Comments

Matthias Brugger July 13, 2021, 11:32 a.m. UTC | #1
On 11/06/2021 08:09, Chuanjia Liu wrote:
> For the new dts format, add a new method to get

> shared pcie-cfg base address and parse node.

> 

> Signed-off-by: Chuanjia Liu <chuanjia.liu@mediatek.com>

> Acked-by: Ryder Lee <ryder.lee@mediatek.com>


You missed the
Reviewed-by: Rob Herring <robh@kernel.org>

given in v8. Or were there any substantial changes in this patch?

> ---

>  drivers/pci/controller/pcie-mediatek.c | 52 +++++++++++++++++++-------

>  1 file changed, 39 insertions(+), 13 deletions(-)

> 

> diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c

> index 62a042e75d9a..950f577a2f44 100644

> --- a/drivers/pci/controller/pcie-mediatek.c

> +++ b/drivers/pci/controller/pcie-mediatek.c

> @@ -14,6 +14,7 @@

>  #include <linux/irqchip/chained_irq.h>

>  #include <linux/irqdomain.h>

>  #include <linux/kernel.h>

> +#include <linux/mfd/syscon.h>

>  #include <linux/msi.h>

>  #include <linux/module.h>

>  #include <linux/of_address.h>

> @@ -23,6 +24,7 @@

>  #include <linux/phy/phy.h>

>  #include <linux/platform_device.h>

>  #include <linux/pm_runtime.h>

> +#include <linux/regmap.h>

>  #include <linux/reset.h>

>  

>  #include "../pci.h"

> @@ -207,6 +209,7 @@ struct mtk_pcie_port {

>   * struct mtk_pcie - PCIe host information

>   * @dev: pointer to PCIe device

>   * @base: IO mapped register base

> + * @cfg: IO mapped register map for PCIe config

>   * @free_ck: free-run reference clock

>   * @mem: non-prefetchable memory resource

>   * @ports: pointer to PCIe port information

> @@ -215,6 +218,7 @@ struct mtk_pcie_port {

>  struct mtk_pcie {

>  	struct device *dev;

>  	void __iomem *base;

> +	struct regmap *cfg;

>  	struct clk *free_ck;

>  

>  	struct list_head ports;

> @@ -650,7 +654,11 @@ static int mtk_pcie_setup_irq(struct mtk_pcie_port *port,

>  		return err;

>  	}

>  

> -	port->irq = platform_get_irq(pdev, port->slot);

> +	if (of_find_property(dev->of_node, "interrupt-names", NULL))

> +		port->irq = platform_get_irq_byname(pdev, "pcie_irq");

> +	else

> +		port->irq = platform_get_irq(pdev, port->slot);

> +


Do I understand that this is used for backwards compatibility with older DTS? I
just wonder why we don't need to mandate
interrupt-names = "pcie_irq"
in the binding description.

Regards,
Matthias
Chuanjia Liu July 14, 2021, 10:30 a.m. UTC | #2
On Tue, 2021-07-13 at 13:32 +0200, Matthias Brugger wrote:
> 

> On 11/06/2021 08:09, Chuanjia Liu wrote:

> > For the new dts format, add a new method to get

> > shared pcie-cfg base address and parse node.

> > 

> > Signed-off-by: Chuanjia Liu <chuanjia.liu@mediatek.com>

> > Acked-by: Ryder Lee <ryder.lee@mediatek.com>

> 

> You missed the

> Reviewed-by: Rob Herring <robh@kernel.org>

> given in v8. Or were there any substantial changes in this patch?

> 

Thanks for your review!

Only a small change,as shown below

 		if (err)
-			goto error_put_node;
+			return err;
 	}
I have a description in the V9 version:
fix kernel-ci bot warning,In the scene of using new dts format,
when mtk_pcie_parse_port fails, of_node_put don't need to be called.

So I didn't add reviewed-by rob because I changed the patch。
> > ---

> >  drivers/pci/controller/pcie-mediatek.c | 52 +++++++++++++++++++-------

> >  1 file changed, 39 insertions(+), 13 deletions(-)

> > 

> > diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c

> > index 62a042e75d9a..950f577a2f44 100644

> > --- a/drivers/pci/controller/pcie-mediatek.c

> > +++ b/drivers/pci/controller/pcie-mediatek.c

> > @@ -14,6 +14,7 @@

> >  #include <linux/irqchip/chained_irq.h>

> >  #include <linux/irqdomain.h>

> >  #include <linux/kernel.h>

> > +#include <linux/mfd/syscon.h>

> >  #include <linux/msi.h>

> >  #include <linux/module.h>

> >  #include <linux/of_address.h>

> > @@ -23,6 +24,7 @@

> >  #include <linux/phy/phy.h>

> >  #include <linux/platform_device.h>

> >  #include <linux/pm_runtime.h>

> > +#include <linux/regmap.h>

> >  #include <linux/reset.h>

> >  

> >  #include "../pci.h"

> > @@ -207,6 +209,7 @@ struct mtk_pcie_port {

> >   * struct mtk_pcie - PCIe host information

> >   * @dev: pointer to PCIe device

> >   * @base: IO mapped register base

> > + * @cfg: IO mapped register map for PCIe config

> >   * @free_ck: free-run reference clock

> >   * @mem: non-prefetchable memory resource

> >   * @ports: pointer to PCIe port information

> > @@ -215,6 +218,7 @@ struct mtk_pcie_port {

> >  struct mtk_pcie {

> >  	struct device *dev;

> >  	void __iomem *base;

> > +	struct regmap *cfg;

> >  	struct clk *free_ck;

> >  

> >  	struct list_head ports;

> > @@ -650,7 +654,11 @@ static int mtk_pcie_setup_irq(struct mtk_pcie_port *port,

> >  		return err;

> >  	}

> >  

> > -	port->irq = platform_get_irq(pdev, port->slot);

> > +	if (of_find_property(dev->of_node, "interrupt-names", NULL))

> > +		port->irq = platform_get_irq_byname(pdev, "pcie_irq");

> > +	else

> > +		port->irq = platform_get_irq(pdev, port->slot);

> > +

> 

> Do I understand that this is used for backwards compatibility with older DTS? I

> just wonder why we don't need to mandate

> interrupt-names = "pcie_irq"

> in the binding description.

Yes,this is used for backwards compatibility with older DTS。
If necessary, I will add the following in binding description.
- interrupt-names:Must include the following entries:
    - "pcie_irq": The interrupt that is asserted when an MSI/INTX is
received

Best regards
Chuanjia
> 

> Regards,

> Matthias
diff mbox series

Patch

diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
index 62a042e75d9a..950f577a2f44 100644
--- a/drivers/pci/controller/pcie-mediatek.c
+++ b/drivers/pci/controller/pcie-mediatek.c
@@ -14,6 +14,7 @@ 
 #include <linux/irqchip/chained_irq.h>
 #include <linux/irqdomain.h>
 #include <linux/kernel.h>
+#include <linux/mfd/syscon.h>
 #include <linux/msi.h>
 #include <linux/module.h>
 #include <linux/of_address.h>
@@ -23,6 +24,7 @@ 
 #include <linux/phy/phy.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
+#include <linux/regmap.h>
 #include <linux/reset.h>
 
 #include "../pci.h"
@@ -207,6 +209,7 @@  struct mtk_pcie_port {
  * struct mtk_pcie - PCIe host information
  * @dev: pointer to PCIe device
  * @base: IO mapped register base
+ * @cfg: IO mapped register map for PCIe config
  * @free_ck: free-run reference clock
  * @mem: non-prefetchable memory resource
  * @ports: pointer to PCIe port information
@@ -215,6 +218,7 @@  struct mtk_pcie_port {
 struct mtk_pcie {
 	struct device *dev;
 	void __iomem *base;
+	struct regmap *cfg;
 	struct clk *free_ck;
 
 	struct list_head ports;
@@ -650,7 +654,11 @@  static int mtk_pcie_setup_irq(struct mtk_pcie_port *port,
 		return err;
 	}
 
-	port->irq = platform_get_irq(pdev, port->slot);
+	if (of_find_property(dev->of_node, "interrupt-names", NULL))
+		port->irq = platform_get_irq_byname(pdev, "pcie_irq");
+	else
+		port->irq = platform_get_irq(pdev, port->slot);
+
 	if (port->irq < 0)
 		return port->irq;
 
@@ -682,6 +690,10 @@  static int mtk_pcie_startup_port_v2(struct mtk_pcie_port *port)
 		val |= PCIE_CSR_LTSSM_EN(port->slot) |
 		       PCIE_CSR_ASPM_L1_EN(port->slot);
 		writel(val, pcie->base + PCIE_SYS_CFG_V2);
+	} else if (pcie->cfg) {
+		val = PCIE_CSR_LTSSM_EN(port->slot) |
+		      PCIE_CSR_ASPM_L1_EN(port->slot);
+		regmap_update_bits(pcie->cfg, PCIE_SYS_CFG_V2, val, val);
 	}
 
 	/* Assert all reset signals */
@@ -985,6 +997,7 @@  static int mtk_pcie_subsys_powerup(struct mtk_pcie *pcie)
 	struct device *dev = pcie->dev;
 	struct platform_device *pdev = to_platform_device(dev);
 	struct resource *regs;
+	struct device_node *cfg_node;
 	int err;
 
 	/* get shared registers, which are optional */
@@ -997,6 +1010,14 @@  static int mtk_pcie_subsys_powerup(struct mtk_pcie *pcie)
 		}
 	}
 
+	cfg_node = of_find_compatible_node(NULL, NULL,
+					   "mediatek,generic-pciecfg");
+	if (cfg_node) {
+		pcie->cfg = syscon_node_to_regmap(cfg_node);
+		if (IS_ERR(pcie->cfg))
+			return PTR_ERR(pcie->cfg);
+	}
+
 	pcie->free_ck = devm_clk_get(dev, "free_ck");
 	if (IS_ERR(pcie->free_ck)) {
 		if (PTR_ERR(pcie->free_ck) == -EPROBE_DEFER)
@@ -1029,22 +1050,27 @@  static int mtk_pcie_setup(struct mtk_pcie *pcie)
 	struct device *dev = pcie->dev;
 	struct device_node *node = dev->of_node, *child;
 	struct mtk_pcie_port *port, *tmp;
-	int err;
+	int err, slot;
+
+	slot = of_get_pci_domain_nr(dev->of_node);
+	if (slot < 0) {
+		for_each_available_child_of_node(node, child) {
+			err = of_pci_get_devfn(child);
+			if (err < 0) {
+				dev_err(dev, "failed to get devfn: %d\n", err);
+				goto error_put_node;
+			}
 
-	for_each_available_child_of_node(node, child) {
-		int slot;
+			slot = PCI_SLOT(err);
 
-		err = of_pci_get_devfn(child);
-		if (err < 0) {
-			dev_err(dev, "failed to parse devfn: %d\n", err);
-			goto error_put_node;
+			err = mtk_pcie_parse_port(pcie, child, slot);
+			if (err)
+				goto error_put_node;
 		}
-
-		slot = PCI_SLOT(err);
-
-		err = mtk_pcie_parse_port(pcie, child, slot);
+	} else {
+		err = mtk_pcie_parse_port(pcie, node, slot);
 		if (err)
-			goto error_put_node;
+			return err;
 	}
 
 	err = mtk_pcie_subsys_powerup(pcie);