Add support for Hikey 970 PCIe
Subsystems (7)
v6 cover Add support for Hikey 970 PCIe
This series depends on this one:
https://lore.kernel.org/lkml/[email protected]/
It is available, with its patch dependencies against v5.14-rc1 at:
https://github.com/mchehab/linux/commits/pcie-alternate
This series add support at the pcie-kirin dirver for it to use a separate PHY driver.
Yet, in order to preserve the existing DT schema for Kirin 960, it keeps the Kirin 960 PHY inside the pci driver. I tried to find a way to split it while keeping the DT schema backward-compatible, but currently the PHY core doesn't allow that, as it relies on a "phy" property at the pcie node in order to recognize the PHY driver.
Once the pci-kiring is modified to support an external PHY driver, add a Kirin 970 PHY and add the needed properties for the HiKey 970 board to detect the PCIe.
It should be noticed that the HiKey 970 design uses 4 different GPIO pins, one for each PERST# signal for each PCIe bus device:
- GPIO 56 has a pullup logic from 1V8 to 2V5 connected to a PCIe bridge chip (PEX 8606);
- GPIO 25 has a pullup logic from 1V8 to 3V3 connected to the PERST# pin at the M.2 slot;
- GPIO 220 has a pullup logic from 1V8 to 3V3 connected to the PERST# pin at the PCIe mini slot;
- GPIO 203 has a pullup logic from 1V8 to 3V3 connected to the PERST# pin at the Ethernet chipset.
At the first versions, those were mapped as part of the pci-bus, but the pci-bus.yaml schema only allows a single PERST# GPIO. So, on v5, those were moved to the PHY DT schema. However, as Rob complained, on this version, I opted to add a separate patch (the last one) that moves those back to the PCIe of-node.
If such patch 09/09 is accepted, then this patch for the DT schema should also be accepted:
https://github.com/devicetree-org/dt-schema/pull/56
Tested on Hikey970:
$ lspci 00:00.0 PCI bridge: Huawei Technologies Co., Ltd. Device 3670 (rev 01) 01:00.0 PCI bridge: PLX Technology, Inc. PEX 8606 6 Lane, 6 Port PCI Express Gen 2 (5.0 GT/s) Switch (rev ba) 02:01.0 PCI bridge: PLX Technology, Inc. PEX 8606 6 Lane, 6 Port PCI Express Gen 2 (5.0 GT/s) Switch (rev ba) 02:04.0 PCI bridge: PLX Technology, Inc. PEX 8606 6 Lane, 6 Port PCI Express Gen 2 (5.0 GT/s) Switch (rev ba) 02:05.0 PCI bridge: PLX Technology, Inc. PEX 8606 6 Lane, 6 Port PCI Express Gen 2 (5.0 GT/s) Switch (rev ba) 02:07.0 PCI bridge: PLX Technology, Inc. PEX 8606 6 Lane, 6 Port PCI Express Gen 2 (5.0 GT/s) Switch (rev ba) 02:09.0 PCI bridge: PLX Technology, Inc. PEX 8606 6 Lane, 6 Port PCI Express Gen 2 (5.0 GT/s) Switch (rev ba) 06:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 07)
$ ethtool enp6s0 Settings for enp6s0: Supported ports: [ TP MII ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Half 1000baseT/Full Supported pause frame use: Symmetric Receive-only Supports auto-negotiation: Yes Supported FEC modes: Not reported Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Half 1000baseT/Full Advertised pause frame use: Symmetric Receive-only Advertised auto-negotiation: Yes Advertised FEC modes: Not reported Link partner advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full Link partner advertised pause frame use: Symmetric Receive-only Link partner advertised auto-negotiation: Yes Link partner advertised FEC modes: Not reported Speed: 100Mb/s Duplex: Full Auto-negotiation: on master-slave cfg: preferred slave master-slave status: slave Port: Twisted Pair PHYAD: 0 Transceiver: external MDI-X: Unknown netlink error: Operation not permitted Link detected: yes
Also tested that Hikey 960 keeps being supported:
$ lspci 00:00.0 PCI bridge: Huawei Technologies Co., Ltd. Device 3660 (rev 01)
---
v6:
- Use an alternative approach, in order to keep the Kirin 960 PHY internal to the driver, in order to not break the DT schema. The PHY-specific code were made self-contained at pcie-kirin, in order to make easier to split it in the future, if needed.
v5:
- added "static" to hi3670_pcie_get_eyeparam() declaration on patch 6/8
v4:
- dropped the DTS patch, as it depends on a PMIC-related patch series;
- minor changes at the patch description;
- HiKey and HiSilicon are now using the preferred CamelCase format.
Manivannan Sadhasivam (1):
arm64: dts: HiSilicon: Add support for HiKey 970 PCIe controller
hardware
Mauro Carvalho Chehab (8):
PCI: kirin: Reorganize the PHY logic inside the driver
PCI: kirin: add support for a PHY layer
PCI: kirin: Use regmap for APB registers
dt-bindings: PCI: kirin: Fix compatible string
dt-bindings: phy: Add bindings for HiKey 970 PCIe PHY
phy: HiSilicon: Add driver for Kirin 970 PCIe PHY
dt-bindings: PCI: kirin-pcie.txt: Convert it to yaml
phy-hi3670-pcie: move reset-gpios to the PCIe DT schema
.../bindings/pci/hisilicon,kirin-pcie.yaml | 87 ++ .../devicetree/bindings/pci/kirin-pcie.txt | 50 - .../devicetree/bindings/pci/snps,dw-pcie.yaml | 2 +- .../phy/hisilicon,phy-hi3670-pcie.yaml | 94 ++ MAINTAINERS | 2 +- arch/arm64/boot/dts/hisilicon/hi3670.dtsi | 70 ++ .../boot/dts/hisilicon/hikey970-pmic.dtsi | 1 - drivers/pci/controller/dwc/pcie-kirin.c | 408 +++++--- drivers/phy/hisilicon/Kconfig | 10 + drivers/phy/hisilicon/Makefile | 1 + drivers/phy/hisilicon/phy-hi3670-pcie.c | 896 ++++++++++++++++++ 11 files changed, 1424 insertions(+), 197 deletions(-) create mode 100644 Documentation/devicetree/bindings/pci/hisilicon,kirin-pcie.yaml delete mode 100644 Documentation/devicetree/bindings/pci/kirin-pcie.txt create mode 100644 Documentation/devicetree/bindings/phy/hisilicon,phy-hi3670-pcie.yaml create mode 100644 drivers/phy/hisilicon/phy-hi3670-pcie.c
Signature · 8 lines
2.31.1 -- linux-phy mailing list [email protected] https://lists.infradead.org/mailman/listinfo/linux-phy
PATCH v6 1/9 PCI: kirin: Reorganize the PHY logic inside the driver
The pcie-kirin PCIe driver contains internally a PHY interface for Kirin 960.
As the next patches will add support for using an external PHY driver, reorganize the driver in a way that the PHY part will be self-contained.
This could be moved to a separate PHY driver, but a change like that would mean a non-backward-compatible DT schema change.
--- drivers/pci/controller/dwc/pcie-kirin.c | 298 ++++++++++++++---------- 1 file changed, 173 insertions(+), 125 deletions(-)
drivers/pci/controller/dwc/pcie-kirin.c +173 -125
@@ -28,26 +28,16 @@#define to_kirin_pcie (x) dev_get_drvdata((x)->dev) -#define REF_CLK_FREQ 100000000 -/* PCIe ELBI registers */ #define SOC_PCIECTRL_CTRL0_ADDR 0x000#define SOC_PCIECTRL_CTRL1_ADDR 0x004 -#define SOC_PCIEPHY_CTRL2_ADDR 0x008 -#define SOC_PCIEPHY_CTRL3_ADDR 0x00c#define PCIE_ELBI_SLV_DBI_ENABLE (0x1 << 21)/* info located in APB */ #define PCIE_APP_LTSSM_ENABLE 0x01c -#define PCIE_APB_PHY_CTRL0 0x0 -#define PCIE_APB_PHY_CTRL1 0x4#define PCIE_APB_PHY_STATUS0 0x400#define PCIE_LINKUP_ENABLE (0x8020)#define PCIE_LTSSM_ENABLE_BIT (0x1 << 11) -#define PIPE_CLK_STABLE (0x1 << 19) -#define PHY_REF_PAD_BIT (0x1 << 8) -#define PHY_PWR_DOWN_BIT (0x1 << 22) -#define PHY_RST_ACK_BIT (0x1 << 16)/* info located in sysctrl */ #define SCTRL_PCIE_CMOS_OFFSET 0x60
@@ -60,6 +50,29 @@#define PCIE_DEBOUNCE_PARAM 0xF0F400#define PCIE_OE_BYPASS (0x3 << 28) +struct kirin_pcie { +struct dw_pcie *pci; +struct phy *phy; +void __iomem *apb_base; +void *phy_priv;/* Needed for Kirin 960 PHY */ +}; + +/* +* Kirin 960 PHY. Can't be split into a PHY driver without changing the +* DT schema. +*/ + +#define REF_CLK_FREQ 100000000 + +/* PHY info located in APB */ +#define PCIE_APB_PHY_CTRL0 0x0 +#define PCIE_APB_PHY_CTRL1 0x4 +#define PCIE_APB_PHY_STATUS0 0x400 +#define PIPE_CLK_STABLE BIT(19) +#define PHY_REF_PAD_BIT BIT(8) +#define PHY_PWR_DOWN_BIT BIT(22) +#define PHY_RST_ACK_BIT BIT(16) +/* peri_crg ctrl */ #define CRGCTRL_PCIE_ASSERT_OFFSET 0x88#define CRGCTRL_PCIE_ASSERT_BIT 0x8c000000
@@ -69,8 +82,6 @@#define REF_2_PERST_MAX 25000#define PERST_2_ACCESS_MIN 10000#define PERST_2_ACCESS_MAX 12000 -#define LINK_WAIT_MIN 900 -#define LINK_WAIT_MAX 1000#define PIPE_CLK_WAIT_MIN 550#define PIPE_CLK_WAIT_MAX 600#define TIME_CMOS_MIN 100
@@ -78,118 +89,112 @@#define TIME_PHY_PD_MIN 10#define TIME_PHY_PD_MAX 11 -struct kirin_pcie { -struct dw_pcie *pci; -void __iomem *apb_base; -void __iomem *phy_base; +struct hi3660_pcie_phy { +struct device *dev; +void __iomem *base;struct regmap *crgctrl;struct regmap *sysctrl;struct clk *apb_sys_clk;struct clk *apb_phy_clk;struct clk *phy_ref_clk; -struct clk *pcie_aclk; -struct clk *pcie_aux_clk; +struct clk *aclk; +struct clk *aux_clk;int gpio_id_reset; }; -/* Registers in PCIeCTRL */ -static inline void kirin_apb_ctrl_writel (struct kirin_pcie *kirin_pcie, -u32 val,u32 reg) -{ -writel (val, kirin_pcie->apb_base + reg); -} - -static inline u32 kirin_apb_ctrl_readl (struct kirin_pcie *kirin_pcie,u32 reg) -{ -return readl (kirin_pcie->apb_base + reg); -} -/* Registers in PCIePHY */ -static inline void kirin_apb_phy_writel (struct kirin_pcie *kirin_pcie, +static inline void kirin_apb_phy_writel (struct hi3660_pcie_phy *hi3660_pcie_phy,u32 val,u32 reg) { -writel (val, kirin_pcie->phy_base + reg); +writel (val, hi3660_pcie_phy->base + reg); } -static inline u32 kirin_apb_phy_readl (struct kirin_pcie *kirin_pcie,u32 reg) +static inline u32 kirin_apb_phy_readl (struct hi3660_pcie_phy *hi3660_pcie_phy, +u32 reg) { -return readl (kirin_pcie->phy_base + reg); +return readl (hi3660_pcie_phy->base + reg); } -static long kirin_pcie_get_clk (struct kirin_pcie *kirin_pcie, -struct platform_device *pdev) +static int hi3660_pcie_phy_get_clk (struct hi3660_pcie_phy *phy) { -struct device *dev = &pdev->dev; +struct device *dev = phy->dev; - kirin_pcie->phy_ref_clk =devm_clk_get (dev,"pcie_phy_ref" ); -if (IS_ERR (kirin_pcie->phy_ref_clk)) -return PTR_ERR (kirin_pcie->phy_ref_clk); + phy->phy_ref_clk =devm_clk_get (dev,"pcie_phy_ref" ); +if (IS_ERR (phy->phy_ref_clk)) +return PTR_ERR (phy->phy_ref_clk); - kirin_pcie->pcie_aux_clk =devm_clk_get (dev,"pcie_aux" ); -if (IS_ERR (kirin_pcie->pcie_aux_clk)) -return PTR_ERR (kirin_pcie->pcie_aux_clk); + phy->aux_clk =devm_clk_get (dev,"pcie_aux" ); +if (IS_ERR (phy->aux_clk)) +return PTR_ERR (phy->aux_clk); - kirin_pcie->apb_phy_clk =devm_clk_get (dev,"pcie_apb_phy" ); -if (IS_ERR (kirin_pcie->apb_phy_clk)) -return PTR_ERR (kirin_pcie->apb_phy_clk); + phy->apb_phy_clk =devm_clk_get (dev,"pcie_apb_phy" ); +if (IS_ERR (phy->apb_phy_clk)) +return PTR_ERR (phy->apb_phy_clk); - kirin_pcie->apb_sys_clk =devm_clk_get (dev,"pcie_apb_sys" ); -if (IS_ERR (kirin_pcie->apb_sys_clk)) -return PTR_ERR (kirin_pcie->apb_sys_clk); + phy->apb_sys_clk =devm_clk_get (dev,"pcie_apb_sys" ); +if (IS_ERR (phy->apb_sys_clk)) +return PTR_ERR (phy->apb_sys_clk); - kirin_pcie->pcie_aclk =devm_clk_get (dev,"pcie_aclk" ); -if (IS_ERR (kirin_pcie->pcie_aclk)) -return PTR_ERR (kirin_pcie->pcie_aclk); + phy->aclk =devm_clk_get (dev,"pcie_aclk" ); +if (IS_ERR (phy->aclk)) +return PTR_ERR (phy->aclk);return 0 ; } -static long kirin_pcie_get_resource (struct kirin_pcie *kirin_pcie, -struct platform_device *pdev) +static int hi3660_pcie_phy_get_resource (struct hi3660_pcie_phy *phy) { - kirin_pcie->apb_base = -devm_platform_ioremap_resource_byname (pdev,"apb" ); -if (IS_ERR (kirin_pcie->apb_base)) -return PTR_ERR (kirin_pcie->apb_base); - - kirin_pcie->phy_base = -devm_platform_ioremap_resource_byname (pdev,"phy" ); -if (IS_ERR (kirin_pcie->phy_base)) -return PTR_ERR (kirin_pcie->phy_base); - - kirin_pcie->crgctrl = -syscon_regmap_lookup_by_compatible ("hisilicon,hi3660-crgctrl" ); -if (IS_ERR (kirin_pcie->crgctrl)) -return PTR_ERR (kirin_pcie->crgctrl); - - kirin_pcie->sysctrl = -syscon_regmap_lookup_by_compatible ("hisilicon,hi3660-sctrl" ); -if (IS_ERR (kirin_pcie->sysctrl)) -return PTR_ERR (kirin_pcie->sysctrl); +struct device *dev = phy->dev; +struct platform_device *pdev; + +/* registers */ + pdev = container_of(dev, struct platform_device, dev); + + phy->base =devm_platform_ioremap_resource_byname (pdev,"phy" ); +if (IS_ERR (phy->base)) +return PTR_ERR (phy->base); + + phy->crgctrl =syscon_regmap_lookup_by_compatible ("hisilicon,hi3660-crgctrl" ); +if (IS_ERR (phy->crgctrl)) +return PTR_ERR (phy->crgctrl); + + phy->sysctrl =syscon_regmap_lookup_by_compatible ("hisilicon,hi3660-sctrl" ); +if (IS_ERR (phy->sysctrl)) +return PTR_ERR (phy->sysctrl); + +/* gpios */ + phy->gpio_id_reset =of_get_named_gpio (dev->of_node, +"reset-gpios" ,0 ); +if (phy->gpio_id_reset == -EPROBE_DEFER ) { +return -EPROBE_DEFER ; + }else if (!gpio_is_valid (phy->gpio_id_reset)) { +dev_err (phy->dev,"unable to get a valid gpio pin\n" ); +return -ENODEV ; + }return 0 ; } -static int kirin_pcie_phy_init (struct kirin_pcie *kirin_pcie) +static int hi3660_pcie_phy_start (struct hi3660_pcie_phy *phy) { -struct device *dev = kirin_pcie->pci->dev; +struct device *dev = phy->dev;u32 reg_val; - reg_val =kirin_apb_phy_readl (kirin_pcie,PCIE_APB_PHY_CTRL1 ); + reg_val =kirin_apb_phy_readl (phy,PCIE_APB_PHY_CTRL1 ); reg_val &= ~PHY_REF_PAD_BIT ; -kirin_apb_phy_writel (kirin_pcie, reg_val,PCIE_APB_PHY_CTRL1 ); +kirin_apb_phy_writel (phy, reg_val,PCIE_APB_PHY_CTRL1 ); - reg_val =kirin_apb_phy_readl (kirin_pcie,PCIE_APB_PHY_CTRL0 ); + reg_val =kirin_apb_phy_readl (phy,PCIE_APB_PHY_CTRL0 ); reg_val &= ~PHY_PWR_DOWN_BIT ; -kirin_apb_phy_writel (kirin_pcie, reg_val,PCIE_APB_PHY_CTRL0 ); +kirin_apb_phy_writel (phy, reg_val,PCIE_APB_PHY_CTRL0 );usleep_range (TIME_PHY_PD_MIN ,TIME_PHY_PD_MAX ); - reg_val =kirin_apb_phy_readl (kirin_pcie,PCIE_APB_PHY_CTRL1 ); + reg_val =kirin_apb_phy_readl (phy,PCIE_APB_PHY_CTRL1 ); reg_val &= ~PHY_RST_ACK_BIT ; -kirin_apb_phy_writel (kirin_pcie, reg_val,PCIE_APB_PHY_CTRL1 ); +kirin_apb_phy_writel (phy, reg_val,PCIE_APB_PHY_CTRL1 );usleep_range (PIPE_CLK_WAIT_MIN ,PIPE_CLK_WAIT_MAX ); - reg_val =kirin_apb_phy_readl (kirin_pcie,PCIE_APB_PHY_STATUS0 ); + reg_val =kirin_apb_phy_readl (phy,PCIE_APB_PHY_STATUS0 );if (reg_val &PIPE_CLK_STABLE ) {dev_err (dev,"PIPE clk is not stable\n" );return -EINVAL ;
@@ -198,105 +203,157 @@ static int kirin_pcie_phy_init(struct kirin_pcie *kirin_pcie)return 0 ; } -static void kirin_pcie_oe_enable (struct kirin_pcie *kirin_pcie) +static void hi3660_pcie_phy_oe_enable (struct hi3660_pcie_phy *phy) {u32 val; -regmap_read (kirin_pcie->sysctrl,SCTRL_PCIE_OE_OFFSET , &val); +regmap_read (phy->sysctrl,SCTRL_PCIE_OE_OFFSET , &val); val |=PCIE_DEBOUNCE_PARAM ; val &= ~PCIE_OE_BYPASS ; -regmap_write (kirin_pcie->sysctrl,SCTRL_PCIE_OE_OFFSET , val); +regmap_write (phy->sysctrl,SCTRL_PCIE_OE_OFFSET , val); } -static int kirin_pcie_clk_ctrl (struct kirin_pcie *kirin_pcie,bool enable) +static int hi3660_pcie_phy_clk_ctrl (struct hi3660_pcie_phy *phy,bool enable) {int ret =0 ;if (!enable) goto close_clk; - ret =clk_set_rate (kirin_pcie->phy_ref_clk,REF_CLK_FREQ ); + ret =clk_set_rate (phy->phy_ref_clk,REF_CLK_FREQ );if (ret)return ret; - ret =clk_prepare_enable (kirin_pcie->phy_ref_clk); + ret =clk_prepare_enable (phy->phy_ref_clk);if (ret)return ret; - ret =clk_prepare_enable (kirin_pcie->apb_sys_clk); + ret =clk_prepare_enable (phy->apb_sys_clk);if (ret) goto apb_sys_fail; - ret =clk_prepare_enable (kirin_pcie->apb_phy_clk); + ret =clk_prepare_enable (phy->apb_phy_clk);if (ret) goto apb_phy_fail; - ret =clk_prepare_enable (kirin_pcie->pcie_aclk); + ret =clk_prepare_enable (phy->aclk);if (ret) goto aclk_fail; - ret =clk_prepare_enable (kirin_pcie->pcie_aux_clk); + ret =clk_prepare_enable (phy->aux_clk);if (ret) goto aux_clk_fail;return 0 ; close_clk: -clk_disable_unprepare (kirin_pcie->pcie_aux_clk); +clk_disable_unprepare (phy->aux_clk); aux_clk_fail: -clk_disable_unprepare (kirin_pcie->pcie_aclk); +clk_disable_unprepare (phy->aclk); aclk_fail: -clk_disable_unprepare (kirin_pcie->apb_phy_clk); +clk_disable_unprepare (phy->apb_phy_clk); apb_phy_fail: -clk_disable_unprepare (kirin_pcie->apb_sys_clk); +clk_disable_unprepare (phy->apb_sys_clk); apb_sys_fail: -clk_disable_unprepare (kirin_pcie->phy_ref_clk); +clk_disable_unprepare (phy->phy_ref_clk);return ret; } -static int kirin_pcie_power_on (struct kirin_pcie *kirin_pcie) +static int hi3660_pcie_phy_power_on (struct kirin_pcie *pcie) { +struct hi3660_pcie_phy *phy = pcie->phy_priv;int ret;/* Power supply for Host */ -regmap_write (kirin_pcie->sysctrl, +regmap_write (phy->sysctrl,SCTRL_PCIE_CMOS_OFFSET ,SCTRL_PCIE_CMOS_BIT );usleep_range (TIME_CMOS_MIN ,TIME_CMOS_MAX ); -kirin_pcie_oe_enable (kirin_pcie); - ret =kirin_pcie_clk_ctrl (kirin_pcie, true); +hi3660_pcie_phy_oe_enable (phy); + + ret =hi3660_pcie_phy_clk_ctrl (phy, true);if (ret)return ret;/* ISO disable, PCIeCtrl, PHY assert and clk gate clear */ -regmap_write (kirin_pcie->sysctrl, +regmap_write (phy->sysctrl,SCTRL_PCIE_ISO_OFFSET ,SCTRL_PCIE_ISO_BIT ); -regmap_write (kirin_pcie->crgctrl, +regmap_write (phy->crgctrl,CRGCTRL_PCIE_ASSERT_OFFSET ,CRGCTRL_PCIE_ASSERT_BIT ); -regmap_write (kirin_pcie->sysctrl, +regmap_write (phy->sysctrl,SCTRL_PCIE_HPCLK_OFFSET ,SCTRL_PCIE_HPCLK_BIT ); - ret =kirin_pcie_phy_init (kirin_pcie); + ret =hi3660_pcie_phy_start (phy);if (ret) - goto close_clk; + goto disable_clks;/* perst assert Endpoint */ -if (!gpio_request (kirin_pcie->gpio_id_reset,"pcie_perst" )) { +if (!gpio_request (phy->gpio_id_reset,"pcie_perst" )) {usleep_range (REF_2_PERST_MIN ,REF_2_PERST_MAX ); - ret =gpio_direction_output (kirin_pcie->gpio_id_reset,1 ); + ret =gpio_direction_output (phy->gpio_id_reset,1 );if (ret) - goto close_clk; + goto disable_clks;usleep_range (PERST_2_ACCESS_MIN ,PERST_2_ACCESS_MAX ); -return 0 ; } -close_clk: -kirin_pcie_clk_ctrl (kirin_pcie, false); +disable_clks: +hi3660_pcie_phy_clk_ctrl (phy, false);return ret; } +static int hi3660_pcie_phy_init (struct platform_device *pdev, +struct kirin_pcie *pcie) +{ +struct device *dev = &pdev->dev; +struct hi3660_pcie_phy *phy; +int ret; + + phy =devm_kzalloc (dev,sizeof (*phy),GFP_KERNEL ); +if (!phy) +return -ENOMEM ; + + pcie->phy_priv = phy; + phy->dev = dev; + +/* registers */ + pdev = container_of(dev, struct platform_device, dev); + + ret =hi3660_pcie_phy_get_clk (phy); +if (ret) +return ret; + +return hi3660_pcie_phy_get_resource (phy); +} + +/* +* The non-PHY part starts here +*/ + +/* Registers in PCIeCTRL */ +static inline void kirin_apb_ctrl_writel (struct kirin_pcie *kirin_pcie, +u32 val,u32 reg) +{ +writel (val, kirin_pcie->apb_base + reg); +} + +static inline u32 kirin_apb_ctrl_readl (struct kirin_pcie *kirin_pcie,u32 reg) +{ +return readl (kirin_pcie->apb_base + reg); +} + +static long kirin_pcie_get_resource (struct kirin_pcie *kirin_pcie, +struct platform_device *pdev) +{ + kirin_pcie->apb_base = +devm_platform_ioremap_resource_byname (pdev,"apb" ); +if (IS_ERR (kirin_pcie->apb_base)) +return PTR_ERR (kirin_pcie->apb_base); + +return 0 ; +} +static void kirin_pcie_sideband_dbi_w_mode (struct kirin_pcie *kirin_pcie,bool on) {
@@ -444,7 +501,7 @@ static int kirin_pcie_probe(struct platform_device *pdev) pci->pp.ops = &kirin_pcie_host_ops; kirin_pcie->pci = pci; - ret =kirin_pcie_get_clk (kirin_pcie, pdev); + ret =hi3660_pcie_phy_init (pdev, kirin_pcie);if (ret)return ret;
@@ -452,16 +509,7 @@ static int kirin_pcie_probe(struct platform_device *pdev)if (ret)return ret; - kirin_pcie->gpio_id_reset =of_get_named_gpio (dev->of_node, -"reset-gpios" ,0 ); -if (kirin_pcie->gpio_id_reset == -EPROBE_DEFER ) { -return -EPROBE_DEFER ; - }else if (!gpio_is_valid (kirin_pcie->gpio_id_reset)) { -dev_err (dev,"unable to get a valid gpio pin\n" ); -return -ENODEV ; - } - - ret =kirin_pcie_power_on (kirin_pcie); + ret =hi3660_pcie_phy_power_on (kirin_pcie);if (ret)return ret;
@@ -479,8 +527,8 @@ static struct platform_driver kirin_pcie_driver = { .probe = kirin_pcie_probe, .driver = { .name = "kirin-pcie", - .of_match_table = kirin_pcie_match, - .suppress_bind_attrs = true, + .of_match_table = kirin_pcie_match, + .suppress_bind_attrs = true, }, };builtin_platform_driver (kirin_pcie_driver);
Signature · 1 line
2.31.1
PATCH v6 2/9 PCI: kirin: add support for a PHY layer
In reply to Mauro Carvalho ChehabWhile it is too late to remove the Kirin 960 PHY, the driver should be able to support different PHYs used by other devices.
--- drivers/pci/controller/dwc/pcie-kirin.c | 95 +++++++++++++++++++++---- 1 file changed, 80 insertions(+), 15 deletions(-)
drivers/pci/controller/dwc/pcie-kirin.c +80 -15
@@ -8,16 +8,18 @@* Author: Xiaowei Song <[email protected]> */ -#include <linux/compiler.h> #include <linux/clk.h> +#include <linux/compiler.h> #include <linux/delay.h> #include <linux/err.h> #include <linux/gpio.h> #include <linux/interrupt.h> #include <linux/mfd/syscon.h> #include <linux/of_address.h> +#include <linux/of_device.h> #include <linux/of_gpio.h> #include <linux/of_pci.h> +#include <linux/phy/phy.h> #include <linux/pci.h> #include <linux/pci_regs.h> #include <linux/platform_device.h>
@@ -50,11 +52,18 @@#define PCIE_DEBOUNCE_PARAM 0xF0F400#define PCIE_OE_BYPASS (0x3 << 28) +enum pcie_kirin_phy_type { +PCIE_KIRIN_INTERNAL_PHY , +PCIE_KIRIN_EXTERNAL_PHY +}; +struct kirin_pcie { +enum pcie_kirin_phy_type type; +struct dw_pcie *pci;struct phy *phy;void __iomem *apb_base; -void *phy_priv;/* Needed for Kirin 960 PHY */ +void *phy_priv;/* only for PCIE_KIRIN_INTERNAL_PHY */ };/*
@@ -476,8 +485,63 @@ static const struct dw_pcie_host_ops kirin_pcie_host_ops = { .host_init = kirin_pcie_host_init, }; +static const struct of_device_id kirin_pcie_match[] = { + { + .compatible ="hisilicon,kirin960-pcie" , + .data = (void *)PCIE_KIRIN_INTERNAL_PHY + }, + {}, +}; + +static int kirin_pcie_power_on (struct platform_device *pdev, +struct kirin_pcie *kirin_pcie) +{ +struct device *dev = &pdev->dev; +int ret; + +if (kirin_pcie->type ==PCIE_KIRIN_INTERNAL_PHY ) { + ret =hi3660_pcie_phy_init (pdev, kirin_pcie); +if (ret) +return ret; + +return hi3660_pcie_phy_power_on (kirin_pcie); + } + + kirin_pcie->phy =devm_of_phy_get (dev, dev->of_node,NULL ); +if (IS_ERR (kirin_pcie->phy)) +return PTR_ERR (kirin_pcie->phy); + + ret =phy_init (kirin_pcie->phy); +if (ret) + goto err; + + ret =phy_power_on (kirin_pcie->phy); +if (ret) + goto err; + +return 0 ; +err: +phy_exit (kirin_pcie->phy); +return ret; +} + +static int __exit kirin_pcie_remove(struct platform_device *pdev) +{ +struct kirin_pcie *kirin_pcie =platform_get_drvdata (pdev); + +if (kirin_pcie->type ==PCIE_KIRIN_INTERNAL_PHY ) +return 0 ; + +phy_power_off (kirin_pcie->phy); +phy_exit (kirin_pcie->phy); + +return 0 ; +} +static int kirin_pcie_probe (struct platform_device *pdev) { +enum pcie_kirin_phy_type phy_type; +const struct of_device_id *of_id;struct device *dev = &pdev->dev;struct kirin_pcie *kirin_pcie;struct dw_pcie *pci;
@@ -488,6 +552,14 @@ static int kirin_pcie_probe(struct platform_device *pdev)return -EINVAL ; } + of_id =of_match_device (kirin_pcie_match, dev); +if (!of_id) { +dev_err (dev,"OF data missing\n" ); +return -EINVAL ; + } + + phy_type = (enum pcie_kirin_phy_type )of_id->data; + kirin_pcie =devm_kzalloc (dev,sizeof (struct kirin_pcie ),GFP_KERNEL );if (!kirin_pcie)return -ENOMEM ;
@@ -500,31 +572,24 @@ static int kirin_pcie_probe(struct platform_device *pdev) pci->ops = &kirin_dw_pcie_ops; pci->pp.ops = &kirin_pcie_host_ops; kirin_pcie->pci = pci; - - ret =hi3660_pcie_phy_init (pdev, kirin_pcie); -if (ret) -return ret; + kirin_pcie->type = phy_type; ret =kirin_pcie_get_resource (kirin_pcie, pdev);if (ret)return ret; - ret =hi3660_pcie_phy_power_on (kirin_pcie); -if (ret) -return ret; -platform_set_drvdata (pdev, kirin_pcie); + ret =kirin_pcie_power_on (pdev, kirin_pcie); +if (ret) +return ret; +return dw_pcie_host_init (&pci->pp); } -static const struct of_device_id kirin_pcie_match[] = { - { .compatible ="hisilicon,kirin960-pcie" }, - {}, -}; -static struct platform_driver kirin_pcie_driver = { .probe = kirin_pcie_probe, + .remove =__exit_p (kirin_pcie_remove), .driver = { .name ="kirin-pcie" , .of_match_table = kirin_pcie_match,
Signature · 1 line
2.31.1
Re: [PATCH v6 2/9] PCI: kirin: add support for a PHY layer
In subject:
PCI: kirin: Add support for a PHY later
(s/add/Add/)
Quoted 2 lines · Mauro Carvalho Chehab
While it is too late to remove the Kirin 960 PHY, the driver should be able to support different PHYs used by other devices.
Commit log doesn't actually say what this patch does.
Quoted 50 lines
Signed-off-by Mauro Carvalho Chehab <[email protected]>--- drivers/pci/controller/dwc/pcie-kirin.c | 95 +++++++++++++++++++++---- 1 file changed, 80 insertions(+), 15 deletions(-)drivers/pci/controller/dwc/pcie-kirin.c +11
-2@@ -8,16 +8,18 @@* Author: Xiaowei Song <[email protected]> */ -#include <linux/compiler.h> #include <linux/clk.h> +#include <linux/compiler.h> #include <linux/delay.h> #include <linux/err.h> #include <linux/gpio.h> #include <linux/interrupt.h> #include <linux/mfd/syscon.h> #include <linux/of_address.h> +#include <linux/of_device.h> #include <linux/of_gpio.h> #include <linux/of_pci.h> +#include <linux/phy/phy.h> #include <linux/pci.h> #include <linux/pci_regs.h> #include <linux/platform_device.h> @@ -50,11 +52,18 @@#define PCIE_DEBOUNCE_PARAM 0xF0F400#define PCIE_OE_BYPASS (0x3 << 28) +enum pcie_kirin_phy_type { +PCIE_KIRIN_INTERNAL_PHY , +PCIE_KIRIN_EXTERNAL_PHY +}; +struct kirin_pcie { +enum pcie_kirin_phy_type type; +struct dw_pcie *pci;struct phy *phy;void __iomem *apb_base; -void *phy_priv;/* Needed for Kirin 960 PHY */ +void *phy_priv;/* only for PCIE_KIRIN_INTERNAL_PHY */ };/*
drivers/pci/controller/dwc/pcie-kirin.c static const struct dw_pcie_host_ops kirin_pcie_host_ops = { · line 494
Quoted 10 lines
drivers/pci/controller/dwc/pcie-kirin.c +7
-0@@ -476,8 +485,63 @@ static const struct dw_pcie_host_ops kirin_pcie_host_ops = { .host_init = kirin_pcie_host_init, }; +static const struct of_device_id kirin_pcie_match[] = { + { + .compatible ="hisilicon,kirin960-pcie" , + .data = (void *)PCIE_KIRIN_INTERNAL_PHY + }, + {}, +};
Is there a benefit to moving kirin_pcie_match[] up here? Seemed nice to have it close to its use in kirin_pcie_driver, and would make the diff easier to read. But if it helps to move it, no big deal.
Quoted 108 lines
drivers/pci/controller/dwc/pcie-kirin.c +61
-13+static int kirin_pcie_power_on (struct platform_device *pdev, +struct kirin_pcie *kirin_pcie) +{ +struct device *dev = &pdev->dev; +int ret; + +if (kirin_pcie->type ==PCIE_KIRIN_INTERNAL_PHY ) { + ret =hi3660_pcie_phy_init (pdev, kirin_pcie); +if (ret) +return ret; + +return hi3660_pcie_phy_power_on (kirin_pcie); + } + + kirin_pcie->phy =devm_of_phy_get (dev, dev->of_node,NULL ); +if (IS_ERR (kirin_pcie->phy)) +return PTR_ERR (kirin_pcie->phy); + + ret =phy_init (kirin_pcie->phy); +if (ret) + goto err; + + ret =phy_power_on (kirin_pcie->phy); +if (ret) + goto err; + +return 0 ; +err: +phy_exit (kirin_pcie->phy); +return ret; +} + +static int __exit kirin_pcie_remove(struct platform_device *pdev) +{ +struct kirin_pcie *kirin_pcie =platform_get_drvdata (pdev); + +if (kirin_pcie->type ==PCIE_KIRIN_INTERNAL_PHY ) +return 0 ; + +phy_power_off (kirin_pcie->phy); +phy_exit (kirin_pcie->phy); + +return 0 ; +} +static int kirin_pcie_probe (struct platform_device *pdev) { +enum pcie_kirin_phy_type phy_type; +const struct of_device_id *of_id;struct device *dev = &pdev->dev;struct kirin_pcie *kirin_pcie;struct dw_pcie *pci;@@ -488,6 +552,14 @@ static int kirin_pcie_probe(struct platform_device *pdev)return -EINVAL ; } + of_id =of_match_device (kirin_pcie_match, dev); +if (!of_id) { +dev_err (dev,"OF data missing\n" ); +return -EINVAL ; + } + + phy_type = (enum pcie_kirin_phy_type )of_id->data; + kirin_pcie =devm_kzalloc (dev,sizeof (struct kirin_pcie ),GFP_KERNEL );if (!kirin_pcie)return -ENOMEM ;@@ -500,31 +572,24 @@ static int kirin_pcie_probe(struct platform_device *pdev) pci->ops = &kirin_dw_pcie_ops; pci->pp.ops = &kirin_pcie_host_ops; kirin_pcie->pci = pci; - - ret =hi3660_pcie_phy_init (pdev, kirin_pcie); -if (ret) -return ret; + kirin_pcie->type = phy_type; ret =kirin_pcie_get_resource (kirin_pcie, pdev);if (ret)return ret; - ret =hi3660_pcie_phy_power_on (kirin_pcie); -if (ret) -return ret; -platform_set_drvdata (pdev, kirin_pcie); + ret =kirin_pcie_power_on (pdev, kirin_pcie); +if (ret) +return ret; +return dw_pcie_host_init (&pci->pp); } -static const struct of_device_id kirin_pcie_match[] = { - { .compatible ="hisilicon,kirin960-pcie" }, - {}, -}; -static struct platform_driver kirin_pcie_driver = { .probe = kirin_pcie_probe, + .remove =__exit_p (kirin_pcie_remove), .driver = { .name ="kirin-pcie" , .of_match_table = kirin_pcie_match,Signature · 1 line
2.31.1
PATCH v6 3/9 PCI: kirin: Use regmap for APB registers
In reply to Mauro Carvalho ChehabThe PHY layer need to access APB registers too, for Kirin 970. So, place them into a named regmap.
--- drivers/pci/controller/dwc/pcie-kirin.c | 39 +++++++++++++++++-------- 1 file changed, 27 insertions(+), 12 deletions(-)
drivers/pci/controller/dwc/pcie-kirin.c +27 -12
@@ -61,8 +61,8 @@ struct kirin_pcie {enum pcie_kirin_phy_type type;struct dw_pcie *pci; +struct regmap *apb;struct phy *phy; -void __iomem *apb_base;void *phy_priv;/* only for PCIE_KIRIN_INTERNAL_PHY */ };
@@ -340,6 +340,13 @@ static int hi3660_pcie_phy_init(struct platform_device *pdev,* The non-PHY part starts here */ +static const struct regmap_config pcie_kirin_regmap_conf = { + .name ="kirin_pcie_apb" , + .reg_bits =32 , + .val_bits =32 , + .reg_stride =4 , +}; +/* Registers in PCIeCTRL */ static inline void kirin_apb_ctrl_writel (struct kirin_pcie *kirin_pcie,u32 val,u32 reg)
@@ -355,10 +362,17 @@ static inline u32 kirin_apb_ctrl_readl(struct kirin_pcie *kirin_pcie, u32 reg)static long kirin_pcie_get_resource (struct kirin_pcie *kirin_pcie,struct platform_device *pdev) { - kirin_pcie->apb_base = -devm_platform_ioremap_resource_byname (pdev,"apb" ); -if (IS_ERR (kirin_pcie->apb_base)) -return PTR_ERR (kirin_pcie->apb_base); +struct device *dev = &pdev->dev; +void __iomem *apb_base; + + apb_base =devm_platform_ioremap_resource_byname (pdev,"apb" ); +if (IS_ERR (apb_base)) +return PTR_ERR (apb_base); + + kirin_pcie->apb =devm_regmap_init_mmio (dev, apb_base, + &pcie_kirin_regmap_conf); +if (IS_ERR (kirin_pcie->apb)) +return PTR_ERR (kirin_pcie->apb);return 0 ; }
@@ -368,13 +382,13 @@ static void kirin_pcie_sideband_dbi_w_mode(struct kirin_pcie *kirin_pcie, {u32 val; - val =kirin_apb_ctrl_readl (kirin_pcie,SOC_PCIECTRL_CTRL0_ADDR ); +regmap_read (kirin_pcie->apb,SOC_PCIECTRL_CTRL0_ADDR , &val);if (on) val = val |PCIE_ELBI_SLV_DBI_ENABLE ;else val = val & ~PCIE_ELBI_SLV_DBI_ENABLE ; -kirin_apb_ctrl_writel (kirin_pcie, val,SOC_PCIECTRL_CTRL0_ADDR ); +regmap_write (kirin_pcie->apb,SOC_PCIECTRL_CTRL0_ADDR , val); } static void kirin_pcie_sideband_dbi_r_mode(struct kirin_pcie *kirin_pcie,
@@ -382,13 +396,13 @@ static void kirin_pcie_sideband_dbi_r_mode(struct kirin_pcie *kirin_pcie, {u32 val; - val =kirin_apb_ctrl_readl (kirin_pcie,SOC_PCIECTRL_CTRL1_ADDR ); +regmap_read (kirin_pcie->apb,SOC_PCIECTRL_CTRL1_ADDR , &val);if (on) val = val |PCIE_ELBI_SLV_DBI_ENABLE ;else val = val & ~PCIE_ELBI_SLV_DBI_ENABLE ; -kirin_apb_ctrl_writel (kirin_pcie, val,SOC_PCIECTRL_CTRL1_ADDR ); +regmap_write (kirin_pcie->apb,SOC_PCIECTRL_CTRL1_ADDR , val); } static int kirin_pcie_rd_own_conf(struct pci_bus *bus, unsigned int devfn,
@@ -448,8 +462,9 @@ static void kirin_pcie_write_dbi(struct dw_pcie *pci, void __iomem *base,static int kirin_pcie_link_up (struct dw_pcie *pci) {struct kirin_pcie *kirin_pcie =to_kirin_pcie (pci); -u32 val =kirin_apb_ctrl_readl (kirin_pcie,PCIE_APB_PHY_STATUS0 ); +u32 val; +regmap_read (kirin_pcie->apb,PCIE_APB_PHY_STATUS0 , &val);if ((val &PCIE_LINKUP_ENABLE ) ==PCIE_LINKUP_ENABLE )return 1 ;
@@ -461,8 +476,8 @@ static int kirin_pcie_start_link(struct dw_pcie *pci)struct kirin_pcie *kirin_pcie =to_kirin_pcie (pci);/* assert LTSSM enable */ -kirin_apb_ctrl_writel (kirin_pcie,PCIE_LTSSM_ENABLE_BIT , -PCIE_APP_LTSSM_ENABLE ); +regmap_write (kirin_pcie->apb,PCIE_APP_LTSSM_ENABLE , +PCIE_LTSSM_ENABLE_BIT );return 0 ; }
Signature · 1 line
2.31.1
PATCH v6 4/9 dt-bindings: PCI: kirin: Fix compatible string
In reply to Mauro Carvalho ChehabThe pcie-kirin driver doesn't declare a hisilicon,kirin-pcie. Also, remove the useless comment after the description, as other compat will be supported by the same driver in the future.
--- Documentation/devicetree/bindings/pci/kirin-pcie.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
Documentation/devicetree/bindings/pci/kirin-pcie.txt +2 -2
@@ -9,7 +9,7 @@ Additional properties are described here: Required properties - compatible: - "hisilicon,kirin960-pcie" for PCIe of Kirin960 SoC + "hisilicon,kirin960-pcie" - reg: Should contain rc_dbi, apb, phy, config registers location and length. - reg-names: Must include the following entries: "dbi": controller configuration registers;
@@ -23,7 +23,7 @@ Optional properties: Example based on kirin960: pcie@f4000000 { - compatible = "hisilicon,kirin-pcie"; + compatible = "hisilicon,kirin960-pcie"; reg = <0x0 0xf4000000 0x0 0x1000>, <0x0 0xff3fe000 0x0 0x1000>, <0x0 0xf3f20000 0x0 0x40000>, <0x0 0xF4000000 0 0x2000>; reg-names = "dbi","apb","phy", "config";
Signature · 1 line
2.31.1
PATCH v6 5/9 dt-bindings: phy: Add bindings for HiKey 970 PCIe PHY
In reply to Mauro Carvalho ChehabDocument the bindings for HiKey 970 (hi3670) PCIe PHY interface, supported via the pcie-kirin driver.
--- .../phy/hisilicon,phy-hi3670-pcie.yaml | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 Documentation/devicetree/bindings/phy/hisilicon,phy-hi3670-pcie.yaml
Documentation/devicetree/bindings/phy/hisilicon,phy-hi3670-pcie.yaml new file +98 -0
@@ -0,0 +1,98 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/phy/hisilicon,phy-hi3670-pcie.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: HiSilicon Kirin970 PCIe PHY + +maintainers: + - Mauro Carvalho Chehab <[email protected]> + +description: |+ + Bindings for PCIe PHY on HiSilicon Kirin 970. + +properties: + compatible: + const: hisilicon,hi970-pcie-phy + + "#phy-cells": + const: 0 + + reg: + maxItems: 1 + description: PHY Control registers + + phy-supply: + description: The PCIe PHY power supply + + clocks: + items: + - description: PCIe PHY clock + - description: PCIe AUX clock + - description: PCIe APB PHY clock + - description: PCIe APB SYS clock + - description: PCIe ACLK clock + + clock-names: + items: + - const: phy_ref + - const: aux + - const: apb_phy + - const: apb_sys + - const: aclk + + reset-gpios: + description: PCI PERST reset GPIOs + maxItems: 4 + + clkreq-gpios: + description: Clock request GPIOs + maxItems: 3 + + hisilicon,eye-diagram-param: + $ref: /schemas/types.yaml#/definitions/uint32-array + description: Eye diagram for phy. + +required: + - "#phy-cells" + - compatible + - reg + - reg-names + - clocks + - clock-names + - reset-gpios + - clkreq-gpios + - hisilicon,eye-diagram-param + - phy-supply + +additionalProperties: false + +examples: + - | + #include <dt-bindings/clock/hi3670-clock.h> + + bus { + #address-cells = <2>; + #size-cells = <2>; + pcie_phy: pcie-phy@fc000000 { + compatible = "hisilicon,hi970-pcie-phy"; + reg = <0x0 0xfc000000 0x0 0x80000>; + reg-names = "phy"; + #phy-cells = <0>; + phy-supply = <&ldo33>; + clocks = <&crg_ctrl HI3670_CLK_GATE_PCIEPHY_REF>, + <&crg_ctrl HI3670_CLK_GATE_PCIEAUX>, + <&crg_ctrl HI3670_PCLK_GATE_PCIE_PHY>, + <&crg_ctrl HI3670_PCLK_GATE_PCIE_SYS>, + <&crg_ctrl HI3670_ACLK_GATE_PCIE>; + clock-names = "phy_ref", "aux", + "apb_phy", "apb_sys", "aclk"; + reset-gpios = <&gpio7 0 0 >, <&gpio25 2 0 >, + <&gpio3 1 0 >, <&gpio27 4 0 >; + clkreq-gpios = <&gpio20 6 0 >, <&gpio27 3 0 >, <&gpio17 0 0 >; + hisilicon,eye-diagram-param = <0xFFFFFFFF 0xFFFFFFFF + 0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF>; + }; + }; +...
Signature · 7 lines
2.31.1 -- linux-phy mailing list [email protected] https://lists.infradead.org/mailman/listinfo/linux-phy
Rob Herring
maintainerRe: [PATCH v6 5/9] dt-bindings: phy: Add bindings for HiKey 970 PCIe PHY
Quoted 9 lines · Mauro Carvalho Chehab
Document the bindings for HiKey 970 (hi3670) PCIe PHY interface, supported via the pcie-kirin driver.
Signed-off-by Mauro Carvalho Chehab <[email protected]>--- .../phy/hisilicon,phy-hi3670-pcie.yaml | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 Documentation/devicetree/bindings/phy/hisilicon,phy-hi3670-pcie.yaml
My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check' on your patch (DT_CHECKER_FLAGS is new in v5.13):
yamllint warnings/errors:
dtschema/dtc warnings/errors:
/builds/robherring/linux-dt-review/Documentation/devicetree/bindings/phy/hisilicon,phy-hi3670-pcie.example.dt.yaml: pcie-phy@fc000000: 'reg-names' does not match any of the regexes: 'pinctrl-[0-9]+'
From schema: /builds/robherring/linux-dt-review/Documentation/devicetree/bindings/phy/hisilicon,phy-hi3670-pcie.yaml
\ndoc reference errors (make refcheckdocs):
See https://patchwork.ozlabs.org/patch/1507427
This check can fail if there are any dependencies. The base for a patch series is generally the most recent rc1.
If you already ran 'make dt_binding_check' and didn't see the above error(s), then make sure 'yamllint' is installed and dt-schema is up to date:
pip3 install dtschema --upgrade
Please check and re-submit.
Signature · 3 lines
linux-phy mailing list [email protected] https://lists.infradead.org/mailman/listinfo/linux-phy
PATCH v6 6/9 phy: HiSilicon: Add driver for Kirin 970 PCIe PHY
In reply to Mauro Carvalho ChehabThe Kirin 970 PHY is somewhat similar to the Kirin 960, but it does a lot more. Add the needed bits for PCIe to start working on HiKey 970 boards.
--- drivers/pci/controller/dwc/pcie-kirin.c | 4 + drivers/phy/hisilicon/Kconfig | 10 + drivers/phy/hisilicon/Makefile | 1 + drivers/phy/hisilicon/phy-hi3670-pcie.c | 892 ++++++++++++++++++++++++ 4 files changed, 907 insertions(+) create mode 100644 drivers/phy/hisilicon/phy-hi3670-pcie.c
drivers/pci/controller/dwc/pcie-kirin.c +4 -0
@@ -505,6 +505,10 @@ static const struct of_device_id kirin_pcie_match[] = { .compatible = "hisilicon,kirin960-pcie", .data = (void *)PCIE_KIRIN_INTERNAL_PHY }, + { + .compatible = "hisilicon,kirin970-pcie", + .data = (void *)PCIE_KIRIN_EXTERNAL_PHY + }, {}, };
drivers/phy/hisilicon/Kconfig +10 -0
@@ -33,6 +33,16 @@ config PHY_HI3670_USB To compile this driver as a module, choose M here. +config PHY_HI3670_PCIE + tristate "hi3670 PCIe PHY support" + depends on (ARCH_HISI && ARM64) || COMPILE_TEST + select GENERIC_PHY + select MFD_SYSCON + help + Enable this to support the HiSilicon hi3670 PCIe PHY. + + To compile this driver as a module, choose M here. + config PHY_HISTB_COMBPHY tristate "HiSilicon STB SoCs COMBPHY support" depends on (ARCH_HISI && ARM64) || COMPILE_TEST
drivers/phy/hisilicon/Makefile +1 -0
@@ -2,6 +2,7 @@ obj-$(CONFIG_PHY_HI6220_USB) += phy-hi6220-usb.o obj-$(CONFIG_PHY_HI3660_USB) += phy-hi3660-usb3.o obj-$(CONFIG_PHY_HI3670_USB) += phy-hi3670-usb3.o +obj-$(CONFIG_PHY_HI3670_PCIE) += phy-hi3670-pcie.o obj-$(CONFIG_PHY_HISTB_COMBPHY) += phy-histb-combphy.o obj-$(CONFIG_PHY_HISI_INNO_USB2) += phy-hisi-inno-usb2.o obj-$(CONFIG_PHY_HIX5HD2_SATA) += phy-hix5hd2-sata.o
drivers/phy/hisilicon/phy-hi3670-pcie.c new file +892 -0
892 lines not on this page · raw message
Signature · 7 lines
2.31.1 -- linux-phy mailing list [email protected] https://lists.infradead.org/mailman/listinfo/linux-phy
PATCH v6 7/9 arm64: dts: HiSilicon: Add support for HiKey 970 PCIe controller hardware
In reply to Mauro Carvalho ChehabFrom: Manivannan Sadhasivam <[email protected]>
Add DTS bindings for the HiKey 970 board's PCIe hardware.
--- arch/arm64/boot/dts/hisilicon/hi3670.dtsi | 71 +++++++++++++++++++ .../boot/dts/hisilicon/hikey970-pmic.dtsi | 1 - drivers/pci/controller/dwc/pcie-kirin.c | 12 ---- 3 files changed, 71 insertions(+), 13 deletions(-)
arch/arm64/boot/dts/hisilicon/hi3670.dtsi +71 -0
@@ -177,6 +177,12 @@ sctrl: sctrl@fff0a000 { #clock-cells = <1>; }; + pmctrl: pmctrl@fff31000 { + compatible = "hisilicon,hi3670-pmctrl", "syscon"; + reg = <0x0 0xfff31000 0x0 0x1000>; + #clock-cells = <1>; + }; + iomcu: iomcu@ffd7e000 { compatible = "hisilicon,hi3670-iomcu", "syscon"; reg = <0x0 0xffd7e000 0x0 0x1000>;
@@ -660,6 +666,71 @@ gpio28: gpio@fff1d000 { clock-names = "apb_pclk"; }; + its_pcie: interrupt-controller@f4000000 { + compatible = "arm,gic-v3-its"; + msi-controller; + reg = <0x0 0xf5100000 0x0 0x100000>; + }; + + pcie_phy: pcie-phy@fc000000 { + compatible = "hisilicon,hi970-pcie-phy"; + reg = <0x0 0xfc000000 0x0 0x80000>; + + phy-supply = <&ldo33>; + + clocks = <&crg_ctrl HI3670_CLK_GATE_PCIEPHY_REF>, + <&crg_ctrl HI3670_CLK_GATE_PCIEAUX>, + <&crg_ctrl HI3670_PCLK_GATE_PCIE_PHY>, + <&crg_ctrl HI3670_PCLK_GATE_PCIE_SYS>, + <&crg_ctrl HI3670_ACLK_GATE_PCIE>; + clock-names = "phy_ref", "aux", + "apb_phy", "apb_sys", + "aclk"; + + reset-gpios = <&gpio7 0 0 >, <&gpio25 2 0 >, + <&gpio3 1 0 >, <&gpio27 4 0 >; + + clkreq-gpios = <&gpio20 6 0 >, <&gpio27 3 0 >, + <&gpio17 0 0 >; + + /* vboost iboost pre post main */ + hisilicon,eye-diagram-param = <0xFFFFFFFF 0xFFFFFFFF + 0xFFFFFFFF 0xFFFFFFFF + 0xFFFFFFFF>; + + #phy-cells = <0>; + }; + + pcie@f4000000 { + compatible = "hisilicon,kirin970-pcie"; + reg = <0x0 0xf4000000 0x0 0x1000000>, + <0x0 0xfc180000 0x0 0x1000>, + <0x0 0xf5000000 0x0 0x2000>; + reg-names = "dbi", "apb", "config"; + bus-range = <0x0 0x1>; + msi-parent = <&its_pcie>; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + phys = <&pcie_phy>; + ranges = <0x02000000 0x0 0x00000000 + 0x0 0xf6000000 + 0x0 0x02000000>; + num-lanes = <1>; + #interrupt-cells = <1>; + interrupts = <0 283 4>; + interrupt-names = "msi"; + interrupt-map-mask = <0 0 0 7>; + interrupt-map = <0x0 0 0 1 + &gic GIC_SPI 282 IRQ_TYPE_LEVEL_HIGH>, + <0x0 0 0 2 + &gic GIC_SPI 283 IRQ_TYPE_LEVEL_HIGH>, + <0x0 0 0 3 + &gic GIC_SPI 284 IRQ_TYPE_LEVEL_HIGH>, + <0x0 0 0 4 + &gic GIC_SPI 285 IRQ_TYPE_LEVEL_HIGH>; + }; + /* UFS */ ufs: ufs@ff3c0000 { compatible = "hisilicon,hi3670-ufs", "jedec,ufs-2.1";
arch/arm64/boot/dts/hisilicon/hikey970-pmic.dtsi +0 -1
@@ -73,7 +73,6 @@ ldo33: LDO33 { /* PEX8606 */ regulator-name = "ldo33"; regulator-min-microvolt = <2500000>; regulator-max-microvolt = <3300000>; - regulator-boot-on; }; ldo34: LDO34 { /* GPS AUX IN VDD */
drivers/pci/controller/dwc/pcie-kirin.c +0 -12
@@ -347,18 +347,6 @@ static const struct regmap_config pcie_kirin_regmap_conf = { .reg_stride = 4, }; -/* Registers in PCIeCTRL */ -static inline void kirin_apb_ctrl_writel (struct kirin_pcie *kirin_pcie, -u32 val,u32 reg) -{ -writel (val, kirin_pcie->apb_base + reg); -} - -static inline u32 kirin_apb_ctrl_readl (struct kirin_pcie *kirin_pcie,u32 reg) -{ -return readl (kirin_pcie->apb_base + reg); -} -static long kirin_pcie_get_resource (struct kirin_pcie *kirin_pcie,struct platform_device *pdev) {
Signature · 1 line
2.31.1
PATCH v6 8/9 dt-bindings: PCI: kirin-pcie.txt: Convert it to yaml
In reply to Mauro Carvalho ChehabConvert the file into a JSON description at the yaml format.
--- .../bindings/pci/hisilicon,kirin-pcie.yaml | 87 +++++++++++++++++++ .../devicetree/bindings/pci/kirin-pcie.txt | 50 ----------- .../devicetree/bindings/pci/snps,dw-pcie.yaml | 2 +- MAINTAINERS | 2 +- 4 files changed, 89 insertions(+), 52 deletions(-) create mode 100644 Documentation/devicetree/bindings/pci/hisilicon,kirin-pcie.yaml delete mode 100644 Documentation/devicetree/bindings/pci/kirin-pcie.txt
Documentation/devicetree/bindings/pci/hisilicon,kirin-pcie.yaml new file +87 -0
@@ -0,0 +1,87 @@ +# SPDX-License-Identifier: GPL-2.0 +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/pci/hisilicon,kirin-pcie.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: HiSilicon Kirin SoCs PCIe host DT description + +maintainers: + - Xiaowei Song <[email protected]> + - Binghui Wang <[email protected]> + +description: | + Kirin PCIe host controller is based on the Synopsys DesignWare PCI core. + It shares common functions with the PCIe DesignWare core driver and + inherits common properties defined in + Documentation/devicetree/bindings/pci/snps,dw-pcie.yaml. + +allOf: + - $ref: /schemas/pci/snps,dw-pcie.yaml# + +properties: + compatible: + contains: + enum: + - hisilicon,kirin960-pcie + - hisilicon,kirin970-pcie + + reg: + description: | + Should contain rc_dbi, apb, config registers location and length. + minItems: 3 + maxItems: 4 + + reg-names: + items: + - const: dbi # controller configuration registers + - const: apb # apb Ctrl register defined by Kirin + - const: config # PCIe configuration space registers + - const: phy # apb PHY register used on Kirin 960 PHY + minItems: 3 + maxItems: 4 + + reset-gpios: + description: The GPIO(s) to generate PCIe PERST# assert and deassert signal. + minItems: 1 + maxItems: 4 + +required: + - compatible + - reg + - reg-names + +unevaluatedProperties: false + +examples: + - | + #include <dt-bindings/interrupt-controller/arm-gic.h> + + soc { + #address-cells = <2>; + #size-cells = <2>; + + pcie: pcie@f4000000 { + compatible = "hisilicon,kirin970-pcie"; + reg = <0x0 0xf4000000 0x0 0x1000>, + <0x0 0xff3fe000 0x0 0x1000>, + <0x0 0xf4000000 0 0x2000>; + reg-names = "dbi", "apb", "config"; + bus-range = <0x0 0x1>; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + ranges = <0x02000000 0x0 0x00000000 0x0 0xf5000000 0x0 0x2000000>; + num-lanes = <1>; + #interrupt-cells = <1>; + interrupts = <0 283 4>; + interrupt-names = "msi"; + interrupt-map-mask = <0xf800 0 0 7>; + interrupt-map = <0x0 0 0 1 &gic GIC_SPI 282 IRQ_TYPE_LEVEL_HIGH>, + <0x0 0 0 2 &gic GIC_SPI 283 IRQ_TYPE_LEVEL_HIGH>, + <0x0 0 0 3 &gic GIC_SPI 284 IRQ_TYPE_LEVEL_HIGH>, + <0x0 0 0 4 &gic GIC_SPI 285 IRQ_TYPE_LEVEL_HIGH>; + reset-gpios = <&gpio7 0 0 >, <&gpio25 2 0 >, + <&gpio3 1 0 >, <&gpio27 4 0 >; + }; + };
Documentation/devicetree/bindings/pci/kirin-pcie.txt deleted +0 -50
50 lines not on this page · raw message
Documentation/devicetree/bindings/pci/snps,dw-pcie.yaml +1 -1
@@ -34,7 +34,7 @@ properties: minItems: 2 maxItems: 5 items: - enum: [dbi, dbi2, config, atu, app, elbi, mgmt, ctrl, parf, cfg, link] + enum: [dbi, dbi2, config, atu, apb, app, elbi, mgmt, ctrl, parf, cfg, link] num-lanes: description: |
MAINTAINERS +1 -1
@@ -14420,7 +14420,7 @@ M: Xiaowei Song <[email protected]> M: Binghui Wang <[email protected]> L: [email protected] S: Maintained -F: Documentation/devicetree/bindings/pci/kirin-pcie.txt +F: Documentation/devicetree/bindings/pci/hisilicon,kirin-pcie.yaml F: drivers/pci/controller/dwc/pcie-kirin.c PCIE DRIVER FOR HISILICON STB
Signature · 1 line
2.31.1
PATCH v6 9/9 phy-hi3670-pcie: move reset-gpios to the PCIe DT schema
In reply to Mauro Carvalho ChehabThe PHY interface as found on HiKey 970 uses 4 reset-gpios instead of just one. That seems to be due to electrical requirements, as, on HiKey 970, the PERST# signal is provided via one GPIO per connected/available PCIe device:
- GPIO 56 has a pullup logic from 1V8 to 2V5 connected to a PCIe bridge chip (PEX 8606);
- GPIO 25 has a pullup logic from 1V8 to 3V3 connected to the PERST# pin at the M.2 slot;
- GPIO 220 has a pullup logic from 1V8 to 3V3 connected to the PERST# pin at the PCIe mini slot;
- GPIO 203 has a pullup logic from 1V8 to 3V3 connected to the PERST# pin at the Ethernet chipset.
Originally, this was mapped via the PHY interface, but, as such design may also be used with different hardware, remap this to use the pcie-bus DT schema.
This patch depends on a DT schema patch submitted at:
https://github.com/devicetree-org/dt-schema/pull/56
--- .../phy/hisilicon,phy-hi3670-pcie.yaml | 4 -- arch/arm64/boot/dts/hisilicon/hi3670.dtsi | 5 +- drivers/phy/hisilicon/phy-hi3670-pcie.c | 54 ++++++++++--------- 3 files changed, 31 insertions(+), 32 deletions(-)
Documentation/devicetree/bindings/phy/hisilicon,phy-hi3670-pcie.yaml +0 -4
@@ -42,10 +42,6 @@ properties: - const: apb_sys - const: aclk - reset-gpios: - description: PCI PERST reset GPIOs - maxItems: 4 - clkreq-gpios: description: Clock request GPIOs maxItems: 3
arch/arm64/boot/dts/hisilicon/hi3670.dtsi +2 -3
@@ -687,9 +687,6 @@ pcie_phy: pcie-phy@fc000000 { "apb_phy", "apb_sys", "aclk"; - reset-gpios = <&gpio7 0 0 >, <&gpio25 2 0 >, - <&gpio3 1 0 >, <&gpio27 4 0 >; - clkreq-gpios = <&gpio20 6 0 >, <&gpio27 3 0 >, <&gpio17 0 0 >;
@@ -729,6 +726,8 @@ &gic GIC_SPI 283 IRQ_TYPE_LEVEL_HIGH>, &gic GIC_SPI 284 IRQ_TYPE_LEVEL_HIGH>, <0x0 0 0 4 &gic GIC_SPI 285 IRQ_TYPE_LEVEL_HIGH>; + reset-gpios = <&gpio7 0 0 >, <&gpio25 2 0 >, + <&gpio3 1 0 >, <&gpio27 4 0 >; }; /* UFS */
drivers/phy/hisilicon/phy-hi3670-pcie.c +29 -25
88 lines not on this page · raw message
Signature · 7 lines
2.31.1 -- linux-phy mailing list [email protected] https://lists.infradead.org/mailman/listinfo/linux-phy