diff mbox series

[3/4] phy: cadence-torrent: Do not configure SERDES if it's already configured

Message ID 20210310155445.534-4-kishon@ti.com
State Accepted
Commit b69d39f6841965559afbc3ecb0e3a8366c8999e8
Headers show
Series j721e-wiz/cadence-torrent: Support to skip SERDES configuration | expand

Commit Message

Kishon Vijay Abraham I March 10, 2021, 3:54 p.m. UTC
Do not configure torrent SERDES if it's already configured.

Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>

---
 drivers/phy/cadence/phy-cadence-torrent.c | 32 ++++++++++++++++-------
 1 file changed, 22 insertions(+), 10 deletions(-)

-- 
2.17.1

Comments

Swapnil Jakhade March 18, 2021, 9:55 a.m. UTC | #1
> -----Original Message-----

> From: Kishon Vijay Abraham I <kishon@ti.com>

> Sent: Wednesday, March 10, 2021 9:25 PM

> To: Kishon Vijay Abraham I <kishon@ti.com>; Vinod Koul

> <vkoul@kernel.org>; Rob Herring <robh+dt@kernel.org>; Philipp Zabel

> <p.zabel@pengutronix.de>; Swapnil Kashinath Jakhade

> <sjakhade@cadence.com>

> Cc: linux-kernel@vger.kernel.org; devicetree@vger.kernel.org; Lokesh Vutla

> <lokeshvutla@ti.com>; linux-phy@lists.infradead.org

> 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@ti.com>

> ---

>  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()?
Otherwise,
Reviewed-by: Swapnil Jakhade <sjakhade@cadence.com>


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
Kishon Vijay Abraham I March 30, 2021, 9:57 a.m. UTC | #2
Hi Swapnil,

On 18/03/21 3:25 pm, Swapnil Kashinath Jakhade wrote:
> 

> 

>> -----Original Message-----

>> From: Kishon Vijay Abraham I <kishon@ti.com>

>> Sent: Wednesday, March 10, 2021 9:25 PM

>> To: Kishon Vijay Abraham I <kishon@ti.com>; Vinod Koul

>> <vkoul@kernel.org>; Rob Herring <robh+dt@kernel.org>; Philipp Zabel

>> <p.zabel@pengutronix.de>; Swapnil Kashinath Jakhade

>> <sjakhade@cadence.com>

>> Cc: linux-kernel@vger.kernel.org; devicetree@vger.kernel.org; Lokesh Vutla

>> <lokeshvutla@ti.com>; linux-phy@lists.infradead.org

>> 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@ti.com>

>> ---

>>  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@cadence.com>


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

>
diff mbox series

Patch

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;
 
-	/* 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;