Hi Swapnil, On 18/03/21 3:25 pm, Swapnil Kashinath Jakhade wrote: > > >> -----Original Message----- >> From: Kishon Vijay Abraham I <kishon@xxxxxx> >> Sent: Wednesday, March 10, 2021 9:25 PM >> To: Kishon Vijay Abraham I <kishon@xxxxxx>; Vinod Koul >> <vkoul@xxxxxxxxxx>; Rob Herring <robh+dt@xxxxxxxxxx>; Philipp Zabel >> <p.zabel@xxxxxxxxxxxxxx>; Swapnil Kashinath Jakhade >> <sjakhade@xxxxxxxxxxx> >> Cc: linux-kernel@xxxxxxxxxxxxxxx; devicetree@xxxxxxxxxxxxxxx; Lokesh Vutla >> <lokeshvutla@xxxxxx>; linux-phy@xxxxxxxxxxxxxxxxxxx >> Subject: [PATCH 3/4] phy: cadence-torrent: Do not configure SERDES if it's >> already configured >> >> EXTERNAL MAIL >> >> >> Do not configure torrent SERDES if it's already configured. >> >> Signed-off-by: Kishon Vijay Abraham I <kishon@xxxxxx> >> --- >> drivers/phy/cadence/phy-cadence-torrent.c | 32 ++++++++++++++++------- >> 1 file changed, 22 insertions(+), 10 deletions(-) >> >> diff --git a/drivers/phy/cadence/phy-cadence-torrent.c >> b/drivers/phy/cadence/phy-cadence-torrent.c >> index ab51c4bf7b30..5ee1657f5a1c 100644 >> --- a/drivers/phy/cadence/phy-cadence-torrent.c >> +++ b/drivers/phy/cadence/phy-cadence-torrent.c >> @@ -371,6 +371,10 @@ static const struct phy_ops cdns_torrent_phy_ops = >> { >> .owner = THIS_MODULE, >> }; >> >> +static const struct phy_ops noop_ops = { >> + .owner = THIS_MODULE, >> +}; >> + >> struct cdns_reg_pairs { >> u32 val; >> u32 off; >> @@ -2306,6 +2310,7 @@ static int cdns_torrent_phy_probe(struct >> platform_device *pdev) >> struct device_node *child; >> int ret, subnodes, node = 0, i; >> u32 total_num_lanes = 0; >> + int already_configured; >> u8 init_dp_regmap = 0; >> u32 phy_type; >> >> @@ -2344,16 +2349,20 @@ static int cdns_torrent_phy_probe(struct >> platform_device *pdev) >> if (ret) >> return ret; >> >> - ret = cdns_torrent_reset(cdns_phy); >> - if (ret) >> - goto clk_cleanup; >> + regmap_field_read(cdns_phy->phy_pma_cmn_ctrl_1, >> &already_configured); >> >> - ret = cdns_torrent_clk(cdns_phy); >> - if (ret) >> - goto clk_cleanup; >> + if (!already_configured) { >> + ret = cdns_torrent_reset(cdns_phy); >> + if (ret) >> + goto clk_cleanup; >> + >> + ret = cdns_torrent_clk(cdns_phy); >> + if (ret) >> + goto clk_cleanup; >> > Should if (!already_configured) be checked while calling clk_disable_unprepare()? Both clk_unprepare() and clk_disable() checks for passed clk for ERR or NULL. So don't think it's necessary to have !already_configured check. > Otherwise, > Reviewed-by: Swapnil Jakhade <sjakhade@xxxxxxxxxxx> Thanks Kishon > > Thanks & regards, > Swapnil > >> - /* Enable APB */ >> - reset_control_deassert(cdns_phy->apb_rst); >> + /* Enable APB */ >> + reset_control_deassert(cdns_phy->apb_rst); >> + } >> >> for_each_available_child_of_node(dev->of_node, child) { >> struct phy *gphy; >> @@ -2423,7 +2432,10 @@ static int cdns_torrent_phy_probe(struct >> platform_device *pdev) >> of_property_read_u32(child, "cdns,ssc-mode", >> &cdns_phy->phys[node].ssc_mode); >> >> - gphy = devm_phy_create(dev, child, >> &cdns_torrent_phy_ops); >> + if (!already_configured) >> + gphy = devm_phy_create(dev, child, >> &cdns_torrent_phy_ops); >> + else >> + gphy = devm_phy_create(dev, child, &noop_ops); >> if (IS_ERR(gphy)) { >> ret = PTR_ERR(gphy); >> goto put_child; >> @@ -2507,7 +2519,7 @@ static int cdns_torrent_phy_probe(struct >> platform_device *pdev) >> goto put_lnk_rst; >> } >> >> - if (cdns_phy->nsubnodes > 1) { >> + if (cdns_phy->nsubnodes > 1 && !already_configured) { >> ret = cdns_torrent_phy_configure_multilink(cdns_phy); >> if (ret) >> goto put_lnk_rst; >> -- >> 2.17.1 >