[alsa-devel] [PATCH] ASoC: samsung: odroid: Drop requirement of clocks in the sound node

Krzysztof Kozlowski krzk at kernel.org
Mon Aug 7 20:56:23 CEST 2017


On Fri, Aug 04, 2017 at 12:58:17PM +0200, Sylwester Nawrocki wrote:
> As suggested in reviews the requirement of clocks in the 'sound' node
> is dropped and instead a leaf clock is used to configure frequency
> of the audio root clock PLL. This can work now after the clock tree
> definitions have been updated to allow clock rate setting propagation
> on the path from the I2S controller up to the EPLL.
> 
> This patch also lowers the CODEC master clock frequency so as
> to not exceed the maximum allowed 60 MHz at maximum audio sampling
> rates.
> 
> Signed-off-by: Sylwester Nawrocki <s.nawrocki at samsung.com>
> ---
>  .../devicetree/bindings/sound/samsung,odroid.txt   |  6 ---
>  sound/soc/samsung/odroid.c                         | 44 +++++++++++++++-------
>  2 files changed, 30 insertions(+), 20 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/sound/samsung,odroid.txt b/Documentation/devicetree/bindings/sound/samsung,odroid.txt
> index c30934d..625b1b1 100644
> --- a/Documentation/devicetree/bindings/sound/samsung,odroid.txt
> +++ b/Documentation/devicetree/bindings/sound/samsung,odroid.txt
> @@ -7,9 +7,6 @@ Required properties:
>   - model - the user-visible name of this sound complex
>   - clocks - should contain entries matching clock names in the clock-names
>      property
> - - clock-names - should contain following entries:
> -    - "epll" - indicating the EPLL output clock
> -    - "i2s_rclk" - indicating the RCLK (root) clock of the I2S0 controller
>   - samsung,audio-widgets - this property specifies off-codec audio elements
>     like headphones or speakers, for details see widgets.txt
>   - samsung,audio-routing - a list of the connections between audio
> @@ -46,9 +43,6 @@ sound {
>  		"IN1", "Mic Jack",
>  		"Mic Jack", "MICBIAS";
>  
> -	clocks = <&clock CLK_FOUT_EPLL>, <&i2s0 CLK_I2S_RCLK_SRC>;
> -	clock-names = "epll", "sclk_i2s";
> -
>  	cpu {
>  		sound-dai = <&i2s0 0>;
>  	};
> diff --git a/sound/soc/samsung/odroid.c b/sound/soc/samsung/odroid.c
> index 0834319..44b6de5 100644
> --- a/sound/soc/samsung/odroid.c
> +++ b/sound/soc/samsung/odroid.c
> @@ -19,8 +19,8 @@ struct odroid_priv {
>  	struct snd_soc_card card;
>  	struct snd_soc_dai_link dai_link;
>  
> -	struct clk *pll;
> -	struct clk *rclk;
> +	struct clk *clk_i2s_bus;
> +	struct clk *sclk_i2s;
>  };
>  
>  static int odroid_card_startup(struct snd_pcm_substream *substream)
> @@ -58,13 +58,18 @@ static int odroid_card_hw_params(struct snd_pcm_substream *substream,
>  		return -EINVAL;
>  	}
>  
> -	ret = clk_set_rate(priv->pll, pll_freq + 1);
> +	ret = clk_set_rate(priv->clk_i2s_bus, pll_freq / 2 + 1);
>  	if (ret < 0)
>  		return ret;
>  
> -	rclk_freq = params_rate(params) * 256 * 4;
> +	/*
> +	 *  We add 1 to the rclk_freq value in order to avoid too low clock
> +	 *  frequency values due to the EPLL output frequency not being exact
> +	 *  multiple of the audio sampling rate.
> +	 */
> +	rclk_freq = params_rate(params) * 256 + 1;
>  
> -	ret = clk_set_rate(priv->rclk, rclk_freq);
> +	ret = clk_set_rate(priv->sclk_i2s, rclk_freq);
>  	if (ret < 0)
>  		return ret;
>  
> @@ -118,14 +123,6 @@ static int odroid_audio_probe(struct platform_device *pdev)
>  
>  	snd_soc_card_set_drvdata(card, priv);
>  
> -	priv->pll = devm_clk_get(dev, "epll");
> -	if (IS_ERR(priv->pll))
> -		return PTR_ERR(priv->pll);
> -
> -	priv->rclk = devm_clk_get(dev, "i2s_rclk");
> -	if (IS_ERR(priv->rclk))
> -		return PTR_ERR(priv->rclk);
> -
>  	ret = snd_soc_of_parse_card_name(card, "model");
>  	if (ret < 0)
>  		return ret;
> @@ -171,14 +168,31 @@ static int odroid_audio_probe(struct platform_device *pdev)
>  	link->name = "Primary";
>  	link->stream_name = link->name;
>  
> +

One blank line too much but beside that:

Acked-by: Krzysztof Kozlowski <krzk at kernel.org>

Best regards,
Krzysztof

> +	priv->sclk_i2s = of_clk_get_by_name(link->cpu_of_node, "i2s_opclk1");
> +	if (IS_ERR(priv->sclk_i2s)) {
> +		ret = PTR_ERR(priv->sclk_i2s);
> +		goto err_put_i2s_n;
> +	}
> +
> +	priv->clk_i2s_bus = of_clk_get_by_name(link->cpu_of_node, "iis");
> +	if (IS_ERR(priv->clk_i2s_bus)) {
> +		ret = PTR_ERR(priv->clk_i2s_bus);
> +		goto err_put_sclk;
> +	}
> +
>  	ret = devm_snd_soc_register_card(dev, card);
>  	if (ret < 0) {
>  		dev_err(dev, "snd_soc_register_card() failed: %d\n", ret);
> -		goto err_put_i2s_n;
> +		goto err_put_clk_i2s;
>  	}
>  
>  	return 0;
>  
> +err_put_clk_i2s:
> +	clk_put(priv->clk_i2s_bus);
> +err_put_sclk:
> +	clk_put(priv->sclk_i2s);
>  err_put_i2s_n:
>  	of_node_put(link->cpu_of_node);
>  err_put_codec_n:
> @@ -192,6 +206,8 @@ static int odroid_audio_remove(struct platform_device *pdev)
>  
>  	of_node_put(priv->dai_link.cpu_of_node);
>  	odroid_put_codec_of_nodes(&priv->dai_link);
> +	clk_put(priv->sclk_i2s);
> +	clk_put(priv->clk_i2s_bus);
>  
>  	return 0;
>  }
> -- 
> 1.9.1
> 


More information about the Alsa-devel mailing list