Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 517ca93a authored by Sergei Shtylyov's avatar Sergei Shtylyov Committed by Lorenzo Pieralisi
Browse files

PCI: rcar: Add R-Car gen3 PHY support



On R-Car gen3 SoCs the PCIe PHY has its own register region, thus we
need to add the corresponding code in rcar_pcie_hw_init_gen3() and call
devm_phy_optional_get() at the driver's probing time, so that the
existing R-Car gen3 device trees (not having a PHY node) would still
work (we only need to power up the PHY on R-Car V3H).

Signed-off-by: default avatarSergei Shtylyov <sergei.shtylyov@cogentembedded.com>
[lorenzo.pieralisi@arm.com: updated commit log]
Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: default avatarSimon Horman <horms+renesas@verge.net.au>
Reviewed-by: default avatarRob Herring <robh@kernel.org>
parent bd7b6d14
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -32,6 +32,11 @@ compatible: "renesas,pcie-r8a7743" for the R8A7743 SoC;
	and PCIe bus clocks.
- clock-names: from common clock binding: should be "pcie" and "pcie_bus".

Optional properties:
- phys: from common PHY binding: PHY phandle and specifier (only make sense
	for R-Car gen3 SoCs where the PCIe PHYs have their own register blocks).
- phy-names: from common PHY binding: should be "pcie".

Example:

SoC-specific DT Entry:
+25 −2
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <linux/of_pci.h>
#include <linux/of_platform.h>
#include <linux/pci.h>
#include <linux/phy/phy.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/slab.h>
@@ -141,6 +142,7 @@ static inline struct rcar_msi *to_rcar_msi(struct msi_controller *chip)
/* Structure representing the PCIe interface */
struct rcar_pcie {
	struct device		*dev;
	struct phy		*phy;
	void __iomem		*base;
	struct list_head	resources;
	int			root_bus_nr;
@@ -667,6 +669,21 @@ static int rcar_pcie_hw_init_gen2(struct rcar_pcie *pcie)
	return rcar_pcie_hw_init(pcie);
}

static int rcar_pcie_hw_init_gen3(struct rcar_pcie *pcie)
{
	int err;

	err = phy_init(pcie->phy);
	if (err)
		return err;

	err = phy_power_on(pcie->phy);
	if (err)
		return err;

	return rcar_pcie_hw_init(pcie);
}

static int rcar_msi_alloc(struct rcar_msi *chip)
{
	int msi;
@@ -916,6 +933,10 @@ static int rcar_pcie_get_resources(struct rcar_pcie *pcie)
	struct resource res;
	int err, i;

	pcie->phy = devm_phy_optional_get(dev, "pcie");
	if (IS_ERR(pcie->phy))
		return PTR_ERR(pcie->phy);

	err = of_address_to_resource(dev->of_node, 0, &res);
	if (err)
		return err;
@@ -1056,8 +1077,10 @@ static const struct of_device_id rcar_pcie_of_match[] = {
	  .data = rcar_pcie_hw_init_gen2 },
	{ .compatible = "renesas,pcie-rcar-gen2",
	  .data = rcar_pcie_hw_init_gen2 },
	{ .compatible = "renesas,pcie-r8a7795", .data = rcar_pcie_hw_init },
	{ .compatible = "renesas,pcie-rcar-gen3", .data = rcar_pcie_hw_init },
	{ .compatible = "renesas,pcie-r8a7795",
	  .data = rcar_pcie_hw_init_gen3 },
	{ .compatible = "renesas,pcie-rcar-gen3",
	  .data = rcar_pcie_hw_init_gen3 },
	{},
};