All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 01/11] ASoC: samsung: s3c2412: Handle return value of clk_prepare_enable.
@ 2017-07-26  5:45 Arvind Yadav
  2017-07-26 11:28   ` Mark Brown
  2017-07-26 15:45 ` Krzysztof Kozlowski
  0 siblings, 2 replies; 7+ messages in thread
From: Arvind Yadav @ 2017-07-26  5:45 UTC (permalink / raw)
  To: perex, tiwai, broonie, krzk, sbkim73, lgirdwood; +Cc: alsa-devel, linux-kernel

clk_prepare_enable() can fail here and we must check its return value.

Signed-off-by: Arvind Yadav <arvind.yadav.cs@gmail.com>
---
Chnage in v2 :
             Error handling for things done in s3c_i2sv2_probe().

 sound/soc/samsung/s3c2412-i2s.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/sound/soc/samsung/s3c2412-i2s.c b/sound/soc/samsung/s3c2412-i2s.c
index 0a47182..0b96927 100644
--- a/sound/soc/samsung/s3c2412-i2s.c
+++ b/sound/soc/samsung/s3c2412-i2s.c
@@ -65,13 +65,16 @@ static int s3c2412_i2s_probe(struct snd_soc_dai *dai)
 	s3c2412_i2s.iis_cclk = devm_clk_get(dai->dev, "i2sclk");
 	if (IS_ERR(s3c2412_i2s.iis_cclk)) {
 		pr_err("failed to get i2sclk clock\n");
-		return PTR_ERR(s3c2412_i2s.iis_cclk);
+		ret = PTR_ERR(s3c2412_i2s.iis_cclk);
+		goto err;
 	}
 
 	/* Set MPLL as the source for IIS CLK */
 
 	clk_set_parent(s3c2412_i2s.iis_cclk, clk_get(NULL, "mpll"));
-	clk_prepare_enable(s3c2412_i2s.iis_cclk);
+	ret = clk_prepare_enable(s3c2412_i2s.iis_cclk);
+	if (ret)
+		goto err;
 
 	s3c2412_i2s.iis_cclk = s3c2412_i2s.iis_pclk;
 
@@ -80,6 +83,11 @@ static int s3c2412_i2s_probe(struct snd_soc_dai *dai)
 			      S3C_GPIO_PULL_NONE);
 
 	return 0;
+
+err:
+	clk_disable(s3c2412_i2s.iis_pclk);
+	clk_put(s3c2412_i2s.iis_pclk);
+	return ret;
 }
 
 static int s3c2412_i2s_remove(struct snd_soc_dai *dai)
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 01/11] ASoC: samsung: s3c2412: Handle return value of clk_prepare_enable.
  2017-07-26  5:45 [PATCH v2 01/11] ASoC: samsung: s3c2412: Handle return value of clk_prepare_enable Arvind Yadav
@ 2017-07-26 11:28   ` Mark Brown
  2017-07-26 15:45 ` Krzysztof Kozlowski
  1 sibling, 0 replies; 7+ messages in thread
From: Mark Brown @ 2017-07-26 11:28 UTC (permalink / raw)
  To: Arvind Yadav
  Cc: perex, tiwai, krzk, sbkim73, lgirdwood, alsa-devel, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1294 bytes --]

On Wed, Jul 26, 2017 at 11:15:25AM +0530, Arvind Yadav wrote:

> --- a/sound/soc/samsung/s3c2412-i2s.c
> +++ b/sound/soc/samsung/s3c2412-i2s.c
> @@ -65,13 +65,16 @@ static int s3c2412_i2s_probe(struct snd_soc_dai *dai)
>  	s3c2412_i2s.iis_cclk = devm_clk_get(dai->dev, "i2sclk");
>  	if (IS_ERR(s3c2412_i2s.iis_cclk)) {
>  		pr_err("failed to get i2sclk clock\n");
> -		return PTR_ERR(s3c2412_i2s.iis_cclk);
> +		ret = PTR_ERR(s3c2412_i2s.iis_cclk);
> +		goto err;
>  	}
>  

Why are we making this unrelated change?  None of the error handling we
jump to is relevant if this fails...

>  	/* Set MPLL as the source for IIS CLK */
>  
>  	clk_set_parent(s3c2412_i2s.iis_cclk, clk_get(NULL, "mpll"));
> -	clk_prepare_enable(s3c2412_i2s.iis_cclk);
> +	ret = clk_prepare_enable(s3c2412_i2s.iis_cclk);
> +	if (ret)
> +		goto err;
>  
>  	s3c2412_i2s.iis_cclk = s3c2412_i2s.iis_pclk;
>  
> @@ -80,6 +83,11 @@ static int s3c2412_i2s_probe(struct snd_soc_dai *dai)
>  			      S3C_GPIO_PULL_NONE);
>  
>  	return 0;
> +
> +err:
> +	clk_disable(s3c2412_i2s.iis_pclk);

This will disable the clock if we failed to enable it which is clearly
not correct.  It's also matching a clk_prepare_enable() with a
clk_disable() which is going to leave an unbalanced prepare.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 01/11] ASoC: samsung: s3c2412: Handle return value of clk_prepare_enable.
@ 2017-07-26 11:28   ` Mark Brown
  0 siblings, 0 replies; 7+ messages in thread
From: Mark Brown @ 2017-07-26 11:28 UTC (permalink / raw)
  To: Arvind Yadav; +Cc: alsa-devel, sbkim73, linux-kernel, lgirdwood, krzk, tiwai


[-- Attachment #1.1: Type: text/plain, Size: 1294 bytes --]

On Wed, Jul 26, 2017 at 11:15:25AM +0530, Arvind Yadav wrote:

> --- a/sound/soc/samsung/s3c2412-i2s.c
> +++ b/sound/soc/samsung/s3c2412-i2s.c
> @@ -65,13 +65,16 @@ static int s3c2412_i2s_probe(struct snd_soc_dai *dai)
>  	s3c2412_i2s.iis_cclk = devm_clk_get(dai->dev, "i2sclk");
>  	if (IS_ERR(s3c2412_i2s.iis_cclk)) {
>  		pr_err("failed to get i2sclk clock\n");
> -		return PTR_ERR(s3c2412_i2s.iis_cclk);
> +		ret = PTR_ERR(s3c2412_i2s.iis_cclk);
> +		goto err;
>  	}
>  

Why are we making this unrelated change?  None of the error handling we
jump to is relevant if this fails...

>  	/* Set MPLL as the source for IIS CLK */
>  
>  	clk_set_parent(s3c2412_i2s.iis_cclk, clk_get(NULL, "mpll"));
> -	clk_prepare_enable(s3c2412_i2s.iis_cclk);
> +	ret = clk_prepare_enable(s3c2412_i2s.iis_cclk);
> +	if (ret)
> +		goto err;
>  
>  	s3c2412_i2s.iis_cclk = s3c2412_i2s.iis_pclk;
>  
> @@ -80,6 +83,11 @@ static int s3c2412_i2s_probe(struct snd_soc_dai *dai)
>  			      S3C_GPIO_PULL_NONE);
>  
>  	return 0;
> +
> +err:
> +	clk_disable(s3c2412_i2s.iis_pclk);

This will disable the clock if we failed to enable it which is clearly
not correct.  It's also matching a clk_prepare_enable() with a
clk_disable() which is going to leave an unbalanced prepare.

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 01/11] ASoC: samsung: s3c2412: Handle return value of clk_prepare_enable.
  2017-07-26 11:28   ` Mark Brown
@ 2017-07-26 12:05     ` Arvind Yadav
  -1 siblings, 0 replies; 7+ messages in thread
From: Arvind Yadav @ 2017-07-26 12:05 UTC (permalink / raw)
  To: Mark Brown
  Cc: perex, tiwai, krzk, sbkim73, lgirdwood, alsa-devel, linux-kernel

Hi,


On Wednesday 26 July 2017 04:58 PM, Mark Brown wrote:
> On Wed, Jul 26, 2017 at 11:15:25AM +0530, Arvind Yadav wrote:
>
>> --- a/sound/soc/samsung/s3c2412-i2s.c
>> +++ b/sound/soc/samsung/s3c2412-i2s.c
>> @@ -65,13 +65,16 @@ static int s3c2412_i2s_probe(struct snd_soc_dai *dai)
>>   	s3c2412_i2s.iis_cclk = devm_clk_get(dai->dev, "i2sclk");
>>   	if (IS_ERR(s3c2412_i2s.iis_cclk)) {
>>   		pr_err("failed to get i2sclk clock\n");
>> -		return PTR_ERR(s3c2412_i2s.iis_cclk);
>> +		ret = PTR_ERR(s3c2412_i2s.iis_cclk);
>> +		goto err;
>>   	}
>>   
> Why are we making this unrelated change?  None of the error handling we
> jump to is relevant if this fails...
3c_i2sv2_probe is enabling "iis" clock. If devm_clk_get(, "i2sclk") fails.
we need to disable and free the clock "iis" .
>
>>   	/* Set MPLL as the source for IIS CLK */
>>   
>>   	clk_set_parent(s3c2412_i2s.iis_cclk, clk_get(NULL, "mpll"));
>> -	clk_prepare_enable(s3c2412_i2s.iis_cclk);
>> +	ret = clk_prepare_enable(s3c2412_i2s.iis_cclk);
>> +	if (ret)
>> +		goto err;
>>   
>>   	s3c2412_i2s.iis_cclk = s3c2412_i2s.iis_pclk;
>>   
>> @@ -80,6 +83,11 @@ static int s3c2412_i2s_probe(struct snd_soc_dai *dai)
>>   			      S3C_GPIO_PULL_NONE);
>>   
>>   	return 0;
>> +
>> +err:
>> +	clk_disable(s3c2412_i2s.iis_pclk);
> This will disable the clock if we failed to enable it which is clearly
> not correct.  It's also matching a clk_prepare_enable() with a
> clk_disable() which is going to leave an unbalanced prepare.
s3c_i2sv2_probe is enabling "iis" clock. And s3c2412_i2s_probe is enabling
"i2sclk"  and "mpll"clock. If, "mpll" clk_prepare_enable fails. We need 
to disable and
free the clock "iis".  and devm will handle other clock "i2sclk". In 
this code we have used
"s3c2412_i2s.iis_cclk" for all the clock which is more confusing for me.
Please correct me if i am wrong.

~arvind

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 01/11] ASoC: samsung: s3c2412: Handle return value of clk_prepare_enable.
@ 2017-07-26 12:05     ` Arvind Yadav
  0 siblings, 0 replies; 7+ messages in thread
From: Arvind Yadav @ 2017-07-26 12:05 UTC (permalink / raw)
  To: Mark Brown; +Cc: alsa-devel, sbkim73, linux-kernel, lgirdwood, krzk, tiwai

Hi,


On Wednesday 26 July 2017 04:58 PM, Mark Brown wrote:
> On Wed, Jul 26, 2017 at 11:15:25AM +0530, Arvind Yadav wrote:
>
>> --- a/sound/soc/samsung/s3c2412-i2s.c
>> +++ b/sound/soc/samsung/s3c2412-i2s.c
>> @@ -65,13 +65,16 @@ static int s3c2412_i2s_probe(struct snd_soc_dai *dai)
>>   	s3c2412_i2s.iis_cclk = devm_clk_get(dai->dev, "i2sclk");
>>   	if (IS_ERR(s3c2412_i2s.iis_cclk)) {
>>   		pr_err("failed to get i2sclk clock\n");
>> -		return PTR_ERR(s3c2412_i2s.iis_cclk);
>> +		ret = PTR_ERR(s3c2412_i2s.iis_cclk);
>> +		goto err;
>>   	}
>>   
> Why are we making this unrelated change?  None of the error handling we
> jump to is relevant if this fails...
3c_i2sv2_probe is enabling "iis" clock. If devm_clk_get(, "i2sclk") fails.
we need to disable and free the clock "iis" .
>
>>   	/* Set MPLL as the source for IIS CLK */
>>   
>>   	clk_set_parent(s3c2412_i2s.iis_cclk, clk_get(NULL, "mpll"));
>> -	clk_prepare_enable(s3c2412_i2s.iis_cclk);
>> +	ret = clk_prepare_enable(s3c2412_i2s.iis_cclk);
>> +	if (ret)
>> +		goto err;
>>   
>>   	s3c2412_i2s.iis_cclk = s3c2412_i2s.iis_pclk;
>>   
>> @@ -80,6 +83,11 @@ static int s3c2412_i2s_probe(struct snd_soc_dai *dai)
>>   			      S3C_GPIO_PULL_NONE);
>>   
>>   	return 0;
>> +
>> +err:
>> +	clk_disable(s3c2412_i2s.iis_pclk);
> This will disable the clock if we failed to enable it which is clearly
> not correct.  It's also matching a clk_prepare_enable() with a
> clk_disable() which is going to leave an unbalanced prepare.
s3c_i2sv2_probe is enabling "iis" clock. And s3c2412_i2s_probe is enabling
"i2sclk"  and "mpll"clock. If, "mpll" clk_prepare_enable fails. We need 
to disable and
free the clock "iis".  and devm will handle other clock "i2sclk". In 
this code we have used
"s3c2412_i2s.iis_cclk" for all the clock which is more confusing for me.
Please correct me if i am wrong.

~arvind

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 01/11] ASoC: samsung: s3c2412: Handle return value of clk_prepare_enable.
  2017-07-26 12:05     ` Arvind Yadav
  (?)
@ 2017-07-26 14:47     ` Mark Brown
  -1 siblings, 0 replies; 7+ messages in thread
From: Mark Brown @ 2017-07-26 14:47 UTC (permalink / raw)
  To: Arvind Yadav
  Cc: perex, tiwai, krzk, sbkim73, lgirdwood, alsa-devel, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1048 bytes --]

On Wed, Jul 26, 2017 at 05:35:32PM +0530, Arvind Yadav wrote:
> On Wednesday 26 July 2017 04:58 PM, Mark Brown wrote:
> > On Wed, Jul 26, 2017 at 11:15:25AM +0530, Arvind Yadav wrote:

> > > +err:
> > > +	clk_disable(s3c2412_i2s.iis_pclk);
> > This will disable the clock if we failed to enable it which is clearly
> > not correct.  It's also matching a clk_prepare_enable() with a
> > clk_disable() which is going to leave an unbalanced prepare.

> s3c_i2sv2_probe is enabling "iis" clock. And s3c2412_i2s_probe is enabling
> "i2sclk"  and "mpll"clock. If, "mpll" clk_prepare_enable fails. We need to
> disable and
> free the clock "iis".  and devm will handle other clock "i2sclk". In this
> code we have used
> "s3c2412_i2s.iis_cclk" for all the clock which is more confusing for me.
> Please correct me if i am wrong.

OK, they are different clocks.  This inconsistent handling seems like a
big part of the problem though - it's going to be a source of errors.
We're also still only disabling here, not unpreparing, so we're missing
something.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 01/11] ASoC: samsung: s3c2412: Handle return value of clk_prepare_enable.
  2017-07-26  5:45 [PATCH v2 01/11] ASoC: samsung: s3c2412: Handle return value of clk_prepare_enable Arvind Yadav
  2017-07-26 11:28   ` Mark Brown
@ 2017-07-26 15:45 ` Krzysztof Kozlowski
  1 sibling, 0 replies; 7+ messages in thread
From: Krzysztof Kozlowski @ 2017-07-26 15:45 UTC (permalink / raw)
  To: Arvind Yadav
  Cc: perex, tiwai, broonie, sbkim73, lgirdwood, alsa-devel, linux-kernel

On Wed, Jul 26, 2017 at 11:15:25AM +0530, Arvind Yadav wrote:
> clk_prepare_enable() can fail here and we must check its return value.
> 
> Signed-off-by: Arvind Yadav <arvind.yadav.cs@gmail.com>
> ---
> Chnage in v2 :
>              Error handling for things done in s3c_i2sv2_probe().
> 
>  sound/soc/samsung/s3c2412-i2s.c | 12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/sound/soc/samsung/s3c2412-i2s.c b/sound/soc/samsung/s3c2412-i2s.c
> index 0a47182..0b96927 100644
> --- a/sound/soc/samsung/s3c2412-i2s.c
> +++ b/sound/soc/samsung/s3c2412-i2s.c
> @@ -65,13 +65,16 @@ static int s3c2412_i2s_probe(struct snd_soc_dai *dai)
>  	s3c2412_i2s.iis_cclk = devm_clk_get(dai->dev, "i2sclk");
>  	if (IS_ERR(s3c2412_i2s.iis_cclk)) {
>  		pr_err("failed to get i2sclk clock\n");
> -		return PTR_ERR(s3c2412_i2s.iis_cclk);
> +		ret = PTR_ERR(s3c2412_i2s.iis_cclk);
> +		goto err;

No, this is kind of messy and error-prone. I think that each unit should
rather clean by itself. You should not touch s3c_i2sv2 stuff directly.

Instead define a s3c_i2sv2_cleanup() (or remove() to match the
convention?) and call it here on error-paths.

Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2017-07-26 15:45 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-26  5:45 [PATCH v2 01/11] ASoC: samsung: s3c2412: Handle return value of clk_prepare_enable Arvind Yadav
2017-07-26 11:28 ` Mark Brown
2017-07-26 11:28   ` Mark Brown
2017-07-26 12:05   ` Arvind Yadav
2017-07-26 12:05     ` Arvind Yadav
2017-07-26 14:47     ` Mark Brown
2017-07-26 15:45 ` Krzysztof Kozlowski

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.