From d9e575127b4169061d94c9982c4f0e8aae208c78 Mon Sep 17 00:00:00 2001 From: Sylwester Nawrocki Date: Wed, 7 Mar 2018 18:46:25 +0100 Subject: ASoC: Use proper DT compatible string for Hardkernel Odroid boards The Odroid boards are manufactured by Hardkernel, not Samsung. New compatible string entries are added, with "hardkernel," instead of "samsung," vendor prefix. Support for the old compatible strings is going to be removed after some time. Signed-off-by: Sylwester Nawrocki Reviewed-by: Rob Herring Signed-off-by: Mark Brown --- sound/soc/samsung/odroid.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'sound/soc/samsung/odroid.c') diff --git a/sound/soc/samsung/odroid.c b/sound/soc/samsung/odroid.c index 44b6de5a331a..92d750806d1d 100644 --- a/sound/soc/samsung/odroid.c +++ b/sound/soc/samsung/odroid.c @@ -213,8 +213,10 @@ static int odroid_audio_remove(struct platform_device *pdev) } static const struct of_device_id odroid_audio_of_match[] = { + { .compatible = "hardkernel,odroid-xu3-audio" }, + { .compatible = "hardkernel,odroid-xu4-audio" }, { .compatible = "samsung,odroid-xu3-audio" }, - { .compatible = "samsung,odroid-xu4-audio"}, + { .compatible = "samsung,odroid-xu4-audio" }, { }, }; MODULE_DEVICE_TABLE(of, odroid_audio_of_match); -- cgit v1.2.3 From 1d22c337dc8f3a25638f7262e7bcb5729a34d140 Mon Sep 17 00:00:00 2001 From: Sylwester Nawrocki Date: Wed, 14 Mar 2018 17:41:13 +0100 Subject: ASoC: samsung: odroid: Fix 32000 sample rate handling In case of sample rates lower than 44100 currently there is too low MCLK frequency set for the CODEC. Playback fails with following errors: $ speaker-test -c2 -t sine -f 1500 -l2 -r 32000 Sine wave rate is 1500.0000Hz Rate set to 32000Hz (requested 32000Hz) Buffer size range from 128 to 131072 Period size range from 64 to 65536 Using max buffer size 131072 Periods = 4 Unable to set hw params for playback: Invalid argument Setting of hwparams failed: Invalid argument [ 497.883700] max98090 1-0010: Invalid master clock frequency To fix this the I2S root clock's frequency is increased, depending on sampling rate. Signed-off-by: Sylwester Nawrocki Acked-by: Krzysztof Kozlowski Signed-off-by: Mark Brown --- sound/soc/samsung/odroid.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'sound/soc/samsung/odroid.c') diff --git a/sound/soc/samsung/odroid.c b/sound/soc/samsung/odroid.c index 92d750806d1d..e698e67f5f84 100644 --- a/sound/soc/samsung/odroid.c +++ b/sound/soc/samsung/odroid.c @@ -36,23 +36,26 @@ static int odroid_card_hw_params(struct snd_pcm_substream *substream, { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct odroid_priv *priv = snd_soc_card_get_drvdata(rtd->card); - unsigned int pll_freq, rclk_freq; + unsigned int pll_freq, rclk_freq, rfs; int ret; switch (params_rate(params)) { - case 32000: case 64000: - pll_freq = 131072006U; + pll_freq = 196608001U; + rfs = 384; break; case 44100: case 88200: case 176400: pll_freq = 180633609U; + rfs = 512; break; + case 32000: case 48000: case 96000: case 192000: pll_freq = 196608001U; + rfs = 512; break; default: return -EINVAL; @@ -67,7 +70,7 @@ static int odroid_card_hw_params(struct snd_pcm_substream *substream, * frequency values due to the EPLL output frequency not being exact * multiple of the audio sampling rate. */ - rclk_freq = params_rate(params) * 256 + 1; + rclk_freq = params_rate(params) * rfs + 1; ret = clk_set_rate(priv->sclk_i2s, rclk_freq); if (ret < 0) -- cgit v1.2.3 From 23952006ace5a54caddcda3de6f7676dfe520e86 Mon Sep 17 00:00:00 2001 From: Sylwester Nawrocki Date: Wed, 14 Mar 2018 17:41:14 +0100 Subject: ASoC: samsung: odroid: Drop sample rates that cannot be supported from hw_params() The I2S controller can handle sample rates only up to 96000 and the CPU DAI has already related constraint set so drop the impossible 176400, 192000 switch cases. Signed-off-by: Sylwester Nawrocki Acked-by: Krzysztof Kozlowski Signed-off-by: Mark Brown --- sound/soc/samsung/odroid.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'sound/soc/samsung/odroid.c') diff --git a/sound/soc/samsung/odroid.c b/sound/soc/samsung/odroid.c index e698e67f5f84..e1b59457a327 100644 --- a/sound/soc/samsung/odroid.c +++ b/sound/soc/samsung/odroid.c @@ -46,14 +46,12 @@ static int odroid_card_hw_params(struct snd_pcm_substream *substream, break; case 44100: case 88200: - case 176400: pll_freq = 180633609U; rfs = 512; break; case 32000: case 48000: case 96000: - case 192000: pll_freq = 196608001U; rfs = 512; break; -- cgit v1.2.3 From 4718840e76f74e5868d2001f0ca3a0e5c4292ea0 Mon Sep 17 00:00:00 2001 From: Sylwester Nawrocki Date: Wed, 14 Mar 2018 17:41:15 +0100 Subject: ASoC: samsung: Use snd_soc_of_put_dai_link_codecs() in odroid.c Now when a helper for unreferencing device nodes is available we can get rid of the local implementation. Signed-off-by: Sylwester Nawrocki Acked-by: Krzysztof Kozlowski Signed-off-by: Mark Brown --- sound/soc/samsung/odroid.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) (limited to 'sound/soc/samsung/odroid.c') diff --git a/sound/soc/samsung/odroid.c b/sound/soc/samsung/odroid.c index e1b59457a327..e7b371b07230 100644 --- a/sound/soc/samsung/odroid.c +++ b/sound/soc/samsung/odroid.c @@ -91,18 +91,6 @@ static const struct snd_soc_ops odroid_card_ops = { .hw_params = odroid_card_hw_params, }; -static void odroid_put_codec_of_nodes(struct snd_soc_dai_link *link) -{ - struct snd_soc_dai_link_component *component = link->codecs; - int i; - - for (i = 0; i < link->num_codecs; i++, component++) { - if (!component->of_node) - break; - of_node_put(component->of_node); - } -} - static int odroid_audio_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -197,7 +185,7 @@ err_put_sclk: err_put_i2s_n: of_node_put(link->cpu_of_node); err_put_codec_n: - odroid_put_codec_of_nodes(link); + snd_soc_of_put_dai_link_codecs(link); return ret; } @@ -206,7 +194,7 @@ static int odroid_audio_remove(struct platform_device *pdev) struct odroid_priv *priv = platform_get_drvdata(pdev); of_node_put(priv->dai_link.cpu_of_node); - odroid_put_codec_of_nodes(&priv->dai_link); + snd_soc_of_put_dai_link_codecs(&priv->dai_link); clk_put(priv->sclk_i2s); clk_put(priv->clk_i2s_bus); -- cgit v1.2.3