All of lore.kernel.org
 help / color / mirror / Atom feed
* wm8727  and asoc atmel at91
@ 2010-08-30  8:07 András Takács
  0 siblings, 0 replies; only message in thread
From: András Takács @ 2010-08-30  8:07 UTC (permalink / raw)
  To: alsa-devel

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

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2010-08-30  8:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-08-30  8:07 wm8727 and asoc atmel at91 András Takács

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.