ti-pipe3: PCIe x2 lane mode configuration in dra72
Subsystems (3)
cover ti-pipe3: PCIe x2 lane mode configuration in dra72
DRA72 uses the same pipe3 PHY for the 2nd lane of PCIE and USB3 PHY. By default it is configured to be used as USB3 PHY and some special configuration has to be done inorder to use it for the 2nd lane of PCIE.
This series adds a new dt property and the configuration required to enable 2nd lane of PCIE.
Kishon Vijay Abraham I (2):
dt-bindings: phy: ti-pipe3: Add dt binding to use USB3 PHY for PCIe
phy: ti-pipe3: configure usb3 phy to be used as pcie phy
Documentation/devicetree/bindings/phy/ti-phy.txt | 2 + drivers/phy/ti/phy-ti-pipe3.c | 47 +++++++++++++++++++++--- 2 files changed, 43 insertions(+), 6 deletions(-)
Signature · 6 lines
2.11.0 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 1/2 dt-bindings: phy: ti-pipe3: Add dt binding to use USB3 PHY for PCIe
DRA72 uses USB3 PHY for the 2nd lane of PCIE. Add dt bindings property to indicate if the USB3 PHY should be used for 2nd lane of PCIe.
--- Documentation/devicetree/bindings/phy/ti-phy.txt | 2 ++ 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/phy/ti-phy.txt +2 -0
@@ -93,6 +93,8 @@ Optional properties: register that contains the SATA_PLL_SOFT_RESET bit. Only valid for sata_phy. - syscon-pcs : phandle/offset pair. Phandle to the system control module and the register offset to write the PCS delay value. + - "ti,configure-as-pcie" : property to indicate if the PHY should be + configured as PCIE PHY. Deprecated properties: - ctrl-module : phandle of the control module used by PHY driver to power on
Signature · 1 line
2.11.0
Rob Herring
maintainerRe: [PATCH 1/2] dt-bindings: phy: ti-pipe3: Add dt binding to use USB3 PHY for PCIe
Quoted 13 lines · Kishon Vijay Abraham I
DRA72 uses USB3 PHY for the 2nd lane of PCIE. Add dt bindings property to indicate if the USB3 PHY should be used for 2nd lane of PCIe.
Signed-off-by Kishon Vijay Abraham I <[email protected]>--- Documentation/devicetree/bindings/phy/ti-phy.txt | 2 ++ 1 file changed, 2 insertions(+)Documentation/devicetree/bindings/phy/ti-phy.txt +0
-0
Documentation/devicetree/bindings/phy/ti-phy.txt Optional properties: · line 97
Quoted 5 lines
Documentation/devicetree/bindings/phy/ti-phy.txt +2
-0@@ -93,6 +93,8 @@ Optional properties: register that contains the SATA_PLL_SOFT_RESET bit. Only valid for sata_phy. - syscon-pcs : phandle/offset pair. Phandle to the system control module and the register offset to write the PCS delay value. + - "ti,configure-as-pcie" : property to indicate if the PHY should be + configured as PCIE PHY.
This is not that uncommon as PCIe, 10Gb eth, USB3, SATA are all very electrically similar and the same phy can drive all of them AIUI. The DT already contains the necessary information too because you have a phys property creating a link to PCI host. The problem is either the client side would need to set the mode or you'd have to search all "phys" properties to find the link. There's already a DT function to iterate thru all named properties.
Rob
PATCH 2/2 phy: ti-pipe3: configure usb3 phy to be used as pcie phy
In reply to Kishon Vijay Abraham IDRA72 uses USB3 PHY for the 2nd lane of PCIE. The configuration required to make USB3 PHY used for the 2nd lane of PCIe is done here.
--- drivers/phy/ti/phy-ti-pipe3.c | 47 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-)
drivers/phy/ti/phy-ti-pipe3.c +41 -6
@@ -56,6 +56,12 @@#define SATA_PLL_SOFT_RESET BIT(18) +#define PHY_RX_ANA_PRGRAMMABILITY_REG 0xC +#define MEM_EN_PLLBYP BIT(7) + +#define PHY_TX_TEST_CONFIG 0x2C +#define MEM_ENTESTCLK BIT(31) +#define PIPE3_PHY_PWRCTL_CLK_CMD_MASK 0x003FC000#define PIPE3_PHY_PWRCTL_CLK_CMD_SHIFT 14
@@ -110,6 +116,10 @@#define PLL_IDLE_TIME 100/* in milliseconds */ #define PLL_LOCK_TIME 100/* in milliseconds */ +#define PIPE3_PHY_DISABLE_SYNC_POWER BIT(4) + +#define CONFIGURE_AS_PCIE BIT(0) +struct pipe3_dpll_params {u16 m;u8 n;
@@ -141,6 +151,7 @@ struct ti_pipe3 {unsigned int power_reg;/* power reg. index within syscon */ unsigned int pcie_pcs_reg;/* pcs reg. index in syscon */ bool sata_refclk_enabled; +u32 flags; };static struct pipe3_dpll_map dpll_map_usb[] = {
@@ -233,11 +244,22 @@ static int ti_pipe3_power_on(struct phy *x) rate = rate /1000000 ; mask =OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_CMD_MASK |OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_FREQ_MASK ; - val =PIPE3_PHY_TX_RX_POWERON <<PIPE3_PHY_PWRCTL_CLK_CMD_SHIFT ; + val =PIPE3_PHY_TX_RX_POWERON ; +if (phy->flags &CONFIGURE_AS_PCIE ) + val |=PIPE3_PHY_DISABLE_SYNC_POWER ; + val <<=PIPE3_PHY_PWRCTL_CLK_CMD_SHIFT ; val |= rate <<OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_FREQ_SHIFT ; ret =regmap_update_bits (phy->phy_power_syscon, phy->power_reg, mask, val); + +if (phy->flags &CONFIGURE_AS_PCIE ) { + ret =regmap_update_bits (phy->phy_power_syscon, phy->power_reg, + mask, val); +if (ret <0 ) +return ret; + } +return ret; }
@@ -335,6 +357,19 @@ static int ti_pipe3_init(struct phy *x)int ret =0 ;ti_pipe3_enable_clocks (phy); + +if (phy->flags &CONFIGURE_AS_PCIE ) { + val =ti_pipe3_readl (phy->phy_rx, +PHY_RX_ANA_PRGRAMMABILITY_REG ); + val |=MEM_EN_PLLBYP ; +ti_pipe3_writel (phy->phy_rx,PHY_RX_ANA_PRGRAMMABILITY_REG , + val); + val =ti_pipe3_readl (phy->phy_tx,PHY_TX_TEST_CONFIG ); + val |=MEM_ENTESTCLK ; +ti_pipe3_writel (phy->phy_tx,PHY_TX_TEST_CONFIG , val); +return 0 ; + } +/* * Set pcie_pcs register to 0x96 for proper functioning of phy * as recommended in AM572x TRM SPRUHZ6, section 18.5.2.2, table
@@ -395,7 +430,8 @@ static int ti_pipe3_exit(struct phy *x)return 0 ;/* PCIe doesn't have internal DPLL */ -if (!of_device_is_compatible (phy->dev->of_node,"ti,phy-pipe3-pcie" )) { +if (!of_device_is_compatible (phy->dev->of_node,"ti,phy-pipe3-pcie" ) && + !(phy->flags &CONFIGURE_AS_PCIE )) {/* Put DPLL in IDLE mode */ val =ti_pipe3_readl (phy->pll_ctrl_base,PLL_CONFIGURATION2 ); val |=PLL_IDLE ;
@@ -589,12 +625,8 @@ static int ti_pipe3_get_tx_rx_base(struct ti_pipe3 *phy) {struct resource *res;struct device *dev = phy->dev; -struct device_node *node = dev->of_node;struct platform_device *pdev =to_platform_device (dev); -if (!of_device_is_compatible (node,"ti,phy-pipe3-pcie" )) -return 0 ; - res =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"phy_rx" ); phy->phy_rx =devm_ioremap_resource (dev, res);
@@ -666,6 +698,9 @@ static int ti_pipe3_probe(struct platform_device *pdev)if (ret)return ret; +if (of_property_read_bool (node,"ti,configure-as-pcie" )) + phy->flags |=CONFIGURE_AS_PCIE ; +platform_set_drvdata (pdev, phy);pm_runtime_enable (dev);
Signature · 1 line
2.11.0