mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-16 17:23:55 +08:00
ASoC: Initial audio support for Speyside on Cragganmore 6410
This is minimal code required to get audio out of the Speyside audio subsystem on the Wolfson Cragganmore 6410 reference platform. It sets up the link between the CPU and AIF1 of the WM8915 on the system, enabling audio playback via the headphone and speaker outputs of the device (which require no further configuration except runtime). It allows verification of basic functionality of the system. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Acked-by: Jassi Brar <jassisinghbrar@gmail.com> Acked-by: Liam Girdwood <lrg@ti.com>
This commit is contained in:
parent
9a841ebb9c
commit
9b8dc66fba
@ -170,3 +170,9 @@ config SND_SOC_SMDK_WM8580_PCM
|
||||
select SND_SAMSUNG_PCM
|
||||
help
|
||||
Say Y if you want to add support for SoC audio on the SMDK.
|
||||
|
||||
config SND_SOC_SPEYSIDE
|
||||
tristate "Audio support for Wolfson Speyside"
|
||||
depends on SND_SOC_SAMSUNG && MACH_WLF_CRAGG_6410
|
||||
select SND_SAMSUNG_I2S
|
||||
select SND_SOC_WM8915
|
||||
|
@ -35,6 +35,7 @@ snd-soc-s3c64xx-smartq-wm8987-objs := smartq_wm8987.o
|
||||
snd-soc-goni-wm8994-objs := goni_wm8994.o
|
||||
snd-soc-smdk-spdif-objs := smdk_spdif.o
|
||||
snd-soc-smdk-wm8580pcm-objs := smdk_wm8580pcm.o
|
||||
snd-soc-speyside-objs := speyside.o
|
||||
|
||||
obj-$(CONFIG_SND_SOC_SAMSUNG_JIVE_WM8750) += snd-soc-jive-wm8750.o
|
||||
obj-$(CONFIG_SND_SOC_SAMSUNG_NEO1973_WM8753) += snd-soc-neo1973-wm8753.o
|
||||
@ -53,3 +54,4 @@ obj-$(CONFIG_SND_SOC_SMARTQ) += snd-soc-s3c64xx-smartq-wm8987.o
|
||||
obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_SPDIF) += snd-soc-smdk-spdif.o
|
||||
obj-$(CONFIG_SND_SOC_GONI_AQUILA_WM8994) += snd-soc-goni-wm8994.o
|
||||
obj-$(CONFIG_SND_SOC_SMDK_WM8580_PCM) += snd-soc-smdk-wm8580pcm.o
|
||||
obj-$(CONFIG_SND_SOC_SPEYSIDE) += snd-soc-speyside.o
|
||||
|
123
sound/soc/samsung/speyside.c
Normal file
123
sound/soc/samsung/speyside.c
Normal file
@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Speyside audio support
|
||||
*
|
||||
* Copyright 2011 Wolfson Microelectronics
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#include <sound/soc.h>
|
||||
#include <sound/soc-dapm.h>
|
||||
|
||||
#include "../codecs/wm8915.h"
|
||||
|
||||
static int speyside_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||
struct snd_soc_dai *codec_dai = rtd->codec_dai;
|
||||
int ret;
|
||||
|
||||
ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S
|
||||
| SND_SOC_DAIFMT_NB_NF
|
||||
| SND_SOC_DAIFMT_CBM_CFM);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S
|
||||
| SND_SOC_DAIFMT_NB_NF
|
||||
| SND_SOC_DAIFMT_CBM_CFM);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = snd_soc_dai_set_pll(codec_dai, 0, WM8915_FLL_MCLK1,
|
||||
32768, 256 * 48000);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = snd_soc_dai_set_sysclk(codec_dai, WM8915_SYSCLK_FLL,
|
||||
256 * 48000, SND_SOC_CLOCK_IN);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct snd_soc_ops speyside_ops = {
|
||||
.hw_params = speyside_hw_params,
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_link speyside_dai[] = {
|
||||
{
|
||||
.name = "CPU",
|
||||
.stream_name = "CPU",
|
||||
.cpu_dai_name = "samsung-i2s.0",
|
||||
.codec_dai_name = "wm8915-aif1",
|
||||
.platform_name = "samsung-audio",
|
||||
.codec_name = "wm8915.1-001a",
|
||||
.ops = &speyside_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct snd_soc_card speyside = {
|
||||
.name = "Speyside",
|
||||
.dai_link = speyside_dai,
|
||||
.num_links = ARRAY_SIZE(speyside_dai),
|
||||
};
|
||||
|
||||
static __devinit int speyside_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct snd_soc_card *card = &speyside;
|
||||
int ret;
|
||||
|
||||
card->dev = &pdev->dev;
|
||||
|
||||
ret = snd_soc_register_card(card);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devexit speyside_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct snd_soc_card *card = platform_get_drvdata(pdev);
|
||||
|
||||
snd_soc_unregister_card(card);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver speyside_driver = {
|
||||
.driver = {
|
||||
.name = "speyside",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &snd_soc_pm_ops,
|
||||
},
|
||||
.probe = speyside_probe,
|
||||
.remove = __devexit_p(speyside_remove),
|
||||
};
|
||||
|
||||
static int __init speyside_audio_init(void)
|
||||
{
|
||||
return platform_driver_register(&speyside_driver);
|
||||
}
|
||||
module_init(speyside_audio_init);
|
||||
|
||||
static void __exit speyside_audio_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&speyside_driver);
|
||||
}
|
||||
module_exit(speyside_audio_exit);
|
||||
|
||||
MODULE_DESCRIPTION("Speyside audio support");
|
||||
MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:speyside");
|
Loading…
Reference in New Issue
Block a user