[alsa-devel] ASoC: WM8804: fsi-wm8804

Grzegorz Daniluk g.daniluk at elproma.com.pl
Mon Nov 15 13:26:37 CET 2010

I'm trying to use the wm8804 codec in my SH4-based system (Renesas 
SH7724 to be precise). I have used the latest kernel 2.6.37-rc1 where 
there is the codec driver for wm8804. However, I have to write my own 
fsi-wm8804.c (like e.g. fsi-da7210.c). My code attached below. After 
compiling it with the rest of the kernel sources or compiling as an 
external module my alsa still does not see any soundcards. However, by 
running i2cdetect I can see that the device is correctly taken by the 
codec driver so the problem is somewhere with my fsi-wm8804 probably. 
Could you take a look at this ? Did I miss something from new ASoC api 
so that this module could correctly talk with wm8804 codec driver ? Also 
(when compiled as modules) after loading and doing lsmod I could see 
that the wm8804 module is not used by fsi-wm8804 module (as it was when 
I was playing with wm8940 on previous kernel versions).

best regards,

#include <linux/platform_device.h>
#include <sound/sh_fsi.h>

static int fsi_wm8804_init(struct snd_soc_codec *codec)

    return 0;

static int fsi_wm8804_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 *dai = rtd->codec_dai;

    printk("%s\n", __FUNCTION__);

    if(substream->stream == SNDRV_PCM_STREAM_CAPTURE)
        snd_soc_dai_set_pll(dai, 0, 0, 12000000, 94310400);
    else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
        snd_soc_dai_set_pll(dai, 0, 0, 12000000, 98304000);

    snd_soc_dai_set_fmt(dai, SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF 

    return 0;

static struct snd_soc_ops fsi_wm8804_ops = {
    .hw_params    = fsi_wm8804_hw_params,

static struct snd_soc_dai_link fsi_wm8804_dai = {
    .name        = "WM8804",
    .stream_name    = "WM8804",
    .cpu_dai_name    = "fsib-dai", /* FSI B */
    .codec_dai_name    = "wm8804-spdif",
    .platform_name    = "sh_fsi.0",
    .codec_name    = "wm8804.0-003a",    /*0x3a is codec I2C addr*/
    .init        = fsi_wm8804_init,
    .ops        = &fsi_wm8804_ops,

static struct snd_soc_card fsi_soc_card = {
    .name        = "FSI (WM8804)",
    .dai_link    = &fsi_wm8804_dai,
    .num_links    = 1,

static struct platform_device *fsi_wm8804_snd_device;

static int __init fsi_wm8804_sound_init(void)
    int ret;

    printk("%s\n", __FUNCTION__);

    fsi_wm8804_snd_device = platform_device_alloc("soc-audio", FSI_PORT_B);
    if (!fsi_wm8804_snd_device)
        return -ENOMEM;

    platform_set_drvdata(fsi_wm8804_snd_device, &fsi_soc_card);
    ret = platform_device_add(fsi_wm8804_snd_device);
    if (ret)

    return ret;

static void __exit fsi_wm8804_sound_exit(void)
    printk("%s\n", __FUNCTION__);



/* Module information */

More information about the Alsa-devel mailing list