ASoC: atmel: Fixes for AT91SAM9G20-EK audio driver
Merge series from Mark Brown <broonie@kernel.org>: At some point the machine driver for the audio subsystem on the AT91SAM9G20-EK appears to have bitrotted, no longer probing due to effects of the transition to the common clock framework. The first patch in this series fixes the initial probe problem, with the rest of the series being random other fixes and cleanups I noticed while looking at the driver.
This commit is contained in:
commit
514ed489c6
@ -46,35 +46,6 @@
|
||||
*/
|
||||
#undef ENABLE_MIC_INPUT
|
||||
|
||||
static struct clk *mclk;
|
||||
|
||||
static int at91sam9g20ek_set_bias_level(struct snd_soc_card *card,
|
||||
struct snd_soc_dapm_context *dapm,
|
||||
enum snd_soc_bias_level level)
|
||||
{
|
||||
static int mclk_on;
|
||||
int ret = 0;
|
||||
|
||||
switch (level) {
|
||||
case SND_SOC_BIAS_ON:
|
||||
case SND_SOC_BIAS_PREPARE:
|
||||
if (!mclk_on)
|
||||
ret = clk_enable(mclk);
|
||||
if (ret == 0)
|
||||
mclk_on = 1;
|
||||
break;
|
||||
|
||||
case SND_SOC_BIAS_OFF:
|
||||
case SND_SOC_BIAS_STANDBY:
|
||||
if (mclk_on)
|
||||
clk_disable(mclk);
|
||||
mclk_on = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct snd_soc_dapm_widget at91sam9g20ek_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_MIC("Int Mic", NULL),
|
||||
SND_SOC_DAPM_SPK("Ext Spk", NULL),
|
||||
@ -135,7 +106,6 @@ static struct snd_soc_card snd_soc_at91sam9g20ek = {
|
||||
.owner = THIS_MODULE,
|
||||
.dai_link = &at91sam9g20ek_dai,
|
||||
.num_links = 1,
|
||||
.set_bias_level = at91sam9g20ek_set_bias_level,
|
||||
|
||||
.dapm_widgets = at91sam9g20ek_dapm_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(at91sam9g20ek_dapm_widgets),
|
||||
@ -148,7 +118,6 @@ static int at91sam9g20ek_audio_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct device_node *codec_np, *cpu_np;
|
||||
struct clk *pllb;
|
||||
struct snd_soc_card *card = &snd_soc_at91sam9g20ek;
|
||||
int ret;
|
||||
|
||||
@ -158,35 +127,10 @@ static int at91sam9g20ek_audio_probe(struct platform_device *pdev)
|
||||
|
||||
ret = atmel_ssc_set_audio(0);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "ssc channel is not valid\n");
|
||||
return -EINVAL;
|
||||
dev_err(&pdev->dev, "ssc channel is not valid: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Codec MCLK is supplied by PCK0 - set it up.
|
||||
*/
|
||||
mclk = clk_get(NULL, "pck0");
|
||||
if (IS_ERR(mclk)) {
|
||||
dev_err(&pdev->dev, "Failed to get MCLK\n");
|
||||
ret = PTR_ERR(mclk);
|
||||
goto err;
|
||||
}
|
||||
|
||||
pllb = clk_get(NULL, "pllb");
|
||||
if (IS_ERR(pllb)) {
|
||||
dev_err(&pdev->dev, "Failed to get PLLB\n");
|
||||
ret = PTR_ERR(pllb);
|
||||
goto err_mclk;
|
||||
}
|
||||
ret = clk_set_parent(mclk, pllb);
|
||||
clk_put(pllb);
|
||||
if (ret != 0) {
|
||||
dev_err(&pdev->dev, "Failed to set MCLK parent\n");
|
||||
goto err_mclk;
|
||||
}
|
||||
|
||||
clk_set_rate(mclk, MCLK_RATE);
|
||||
|
||||
card->dev = &pdev->dev;
|
||||
|
||||
/* Parse device node info */
|
||||
@ -204,7 +148,8 @@ static int at91sam9g20ek_audio_probe(struct platform_device *pdev)
|
||||
codec_np = of_parse_phandle(np, "atmel,audio-codec", 0);
|
||||
if (!codec_np) {
|
||||
dev_err(&pdev->dev, "codec info missing\n");
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
at91sam9g20ek_dai.codecs->of_node = codec_np;
|
||||
|
||||
@ -215,7 +160,8 @@ static int at91sam9g20ek_audio_probe(struct platform_device *pdev)
|
||||
if (!cpu_np) {
|
||||
dev_err(&pdev->dev, "dai and pcm info missing\n");
|
||||
of_node_put(codec_np);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
at91sam9g20ek_dai.cpus->of_node = cpu_np;
|
||||
at91sam9g20ek_dai.platforms->of_node = cpu_np;
|
||||
@ -226,13 +172,11 @@ static int at91sam9g20ek_audio_probe(struct platform_device *pdev)
|
||||
ret = snd_soc_register_card(card);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "snd_soc_register_card() failed\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
|
||||
err_mclk:
|
||||
clk_put(mclk);
|
||||
mclk = NULL;
|
||||
err:
|
||||
atmel_ssc_put_audio(0);
|
||||
return ret;
|
||||
@ -242,8 +186,6 @@ static int at91sam9g20ek_audio_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct snd_soc_card *card = platform_get_drvdata(pdev);
|
||||
|
||||
clk_disable(mclk);
|
||||
mclk = NULL;
|
||||
snd_soc_unregister_card(card);
|
||||
atmel_ssc_put_audio(0);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user