[alsa-devel] wm8727 and asoc atmel at91
András Takács
atakacs at dension.com
Mon Aug 30 10:07:58 CEST 2010
Dear All,
I would like to using a WM8727 codec on my board, which has at Atmel
AT91SAM9261 processor.
I implemented the board specific part of the ASoC driver:
I'm trying to test it with: cat /dev/urandom > /dev/dsp
I'm getting the following error message in dmesg:
[ 7.140000] ASoC: SSC0 device request OK
[ 7.140000] ASoC: wm8727 device allocation OK
[ 7.160000] asoc: WM8727 <-> atmel-ssc0 mapping ok
[ 7.160000] SoC IRF WM8727 init
[ 7.220000] ASoC: wm8727 device registration OK
[ 16.330000] atmel_ssc_startup: SSC_SR=0x204
[ 16.440000] SoC IRF WM8727 hw_params: cpu_dai
[ 16.440000] SoC IRF WM8727 hw_params OK
[ 16.440000] atmel_ssc_hw_params: RCMR=00010721 RFMR=0000008f
TCMR=00010702 TFMR=0000008f
[ 16.440000] atmel_ssc_dai: Starting clock
[ 16.440000] atmel_ssc_dai,hw_params: SSC initialized
[ 16.440000] transmit enabled SSC_SR=0x000104cf
[ 210.850000] ALSA sound/core/pcm_lib.c:1758: playback write error (DMA
or IRQ trouble?)
[ 210.850000] ALSA sound/core/pcm_lib.c:1758: playback write error (DMA
or IRQ trouble?)
[ 220.850000] ALSA sound/core/pcm_native.c:1492: playback drain error
(DMA or IRQ trouble?)
[ 220.850000] atmel_ssc_shutdown: transmit disabled SSC_SR=0x000000c0
[ 220.850000] atmel_ssc_dau: Stopping clock
Did anybody used this codec before? What's missing from my code?
My source code:
static int soc_irf_wm8727_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->dai->cpu_dai;
int ret;
printk("SoC IRF WM8727 hw_params: cpu_dai\n");
/* set cpu DAI configuration */
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;
printk("SoC IRF WM8727 hw_params OK\n");
return 0;
}
static struct snd_soc_ops soc_irf_wm8727_ops = {
.hw_params = soc_irf_wm8727_hw_params,
};
static int soc_irf_wm8727_init(struct snd_soc_codec *codec)
{
printk("SoC IRF WM8727 init\n");
return 0;
}
static struct snd_soc_dai_link soc_irf_wm8727_dai[] = {
{
.name = "WM8727",
.stream_name = "WM8727 PCM",
.cpu_dai = &atmel_ssc_dai[0],
.codec_dai = &wm8727_dai,
.init = soc_irf_wm8727_init,
.ops = &soc_irf_wm8727_ops,
}
};
static struct snd_soc_card snd_soc_wm8727_irf = {
.name = "SOC_IRF_WM8727",
.platform = &atmel_soc_platform,
.dai_link = soc_irf_wm8727_dai,
.num_links = ARRAY_SIZE(soc_irf_wm8727_dai),
};
static struct snd_soc_device soc_irf_wm8727_snd_devdata = {
.card = &snd_soc_wm8727_irf,
.codec_dev = &soc_codec_dev_wm8727,
};
static struct platform_device *soc_irf_wm8727_snd_device;
static int __init soc_irf_init(void)
{
struct atmel_ssc_info *ssc_p_wm8727 =
soc_irf_wm8727_dai[0].cpu_dai->private_data;
struct ssc_device *ssc = NULL;
int ret;
/* Request SSC device */
ssc = ssc_request(0);
if (IS_ERR(ssc)) {
printk(KERN_ERR "ASoC: Failed to request SSC 0\n");
ret = PTR_ERR(ssc);
ssc = NULL;
goto err;
}
ssc_p_wm8727->ssc = ssc;
printk("ASoC: SSC0 device request OK\n");
at91_set_B_periph(AT91_PIN_PA17, 1);
at91_set_B_periph(AT91_PIN_PA18, 1);
at91_set_B_periph(AT91_PIN_PA19, 1);
/* WM8727 codec */
soc_irf_wm8727_snd_device = platform_device_alloc("soc-audio", 1);
if (!soc_irf_wm8727_snd_device) {
printk(KERN_ERR "ASoC: Platform device allocation failed:
wm8727\n");
ret = -ENOMEM;
goto err_ssc;
}
printk("ASoC: wm8727 device allocation OK\n");
platform_set_drvdata(soc_irf_wm8727_snd_device,
&soc_irf_wm8727_snd_devdata);
soc_irf_wm8727_snd_devdata.dev = &soc_irf_wm8727_snd_device->dev;
ret = platform_device_add(soc_irf_wm8727_snd_device);
if (ret) {
printk(KERN_ERR "ASoC: Platform device allocation failed:
wm8727\n");
ret = -ENODEV;
goto err_wm8727;
}
printk("ASoC: wm8727 device registration OK\n");
return ret;
err_ssc:
ssc_free(ssc);
ssc_p_wm8727->ssc = NULL;
err:
return ret;
}
static void __exit soc_irf_exit(void)
{
struct atmel_ssc_info *ssc_p_wm8727 =
soc_irf_wm8727_dai[0].cpu_dai->private_data;
struct ssc_device *ssc;
if (ssc_p_wm8727 != NULL) {
ssc = ssc_p_wm8727->ssc;
if (ssc != NULL)
ssc_free(ssc);
ssc_p_wm8727->ssc = NULL;
}
platform_device_unregister(soc_irf_wm8727_snd_device);
soc_irf_wm8727_snd_device = NULL;
}
module_init(soc_irf_init);
module_exit(soc_irf_exit);
Thank you for your help!
BR,
András
More information about the Alsa-devel
mailing list