imote2.c 2.2 KB
Newer Older
J
Jonathan Cameron 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13

#include <linux/module.h>
#include <sound/soc.h>

#include <asm/mach-types.h>

#include "../codecs/wm8940.h"
#include "pxa2xx-i2s.h"

static int imote2_asoc_hw_params(struct snd_pcm_substream *substream,
				 struct snd_pcm_hw_params *params)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
14 15
	struct snd_soc_dai *codec_dai = rtd->codec_dai;
	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
J
Jonathan Cameron 已提交
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
	unsigned int clk = 0;
	int ret;

	switch (params_rate(params)) {
	case 8000:
	case 16000:
	case 48000:
	case 96000:
		clk = 12288000;
		break;
	case 11025:
	case 22050:
	case 44100:
		clk = 11289600;
		break;
	}

	ret = snd_soc_dai_set_sysclk(codec_dai, 0, clk,
				     SND_SOC_CLOCK_IN);
	if (ret < 0)
		return ret;

	/* set the I2S system clock as input (unused) */
	ret = snd_soc_dai_set_sysclk(cpu_dai, PXA2XX_I2S_SYSCLK, clk,
		SND_SOC_CLOCK_OUT);

	return ret;
}

static struct snd_soc_ops imote2_asoc_ops = {
	.hw_params = imote2_asoc_hw_params,
};

static struct snd_soc_dai_link imote2_dai = {
	.name = "WM8940",
	.stream_name = "WM8940",
52
	.cpu_dai_name = "pxa2xx-i2s",
53 54 55
	.codec_dai_name = "wm8940-hifi",
	.platform_name = "pxa-pcm-audio",
	.codec_name = "wm8940-codec.0-0034",
56 57
	.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
		   SND_SOC_DAIFMT_CBS_CFS,
J
Jonathan Cameron 已提交
58 59 60
	.ops = &imote2_asoc_ops,
};

61
static struct snd_soc_card imote2 = {
J
Jonathan Cameron 已提交
62 63 64 65 66
	.name = "Imote2",
	.dai_link = &imote2_dai,
	.num_links = 1,
};

67
static int __devinit imote2_probe(struct platform_device *pdev)
J
Jonathan Cameron 已提交
68
{
69
	struct snd_soc_card *card = &imote2;
J
Jonathan Cameron 已提交
70 71
	int ret;

72
	card->dev = &pdev->dev;
J
Jonathan Cameron 已提交
73

74
	ret = snd_soc_register_card(card);
J
Jonathan Cameron 已提交
75
	if (ret)
76 77
		dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
			ret);
J
Jonathan Cameron 已提交
78 79 80
	return ret;
}

81
static int __devexit imote2_remove(struct platform_device *pdev)
J
Jonathan Cameron 已提交
82
{
83 84 85 86
	struct snd_soc_card *card = platform_get_drvdata(pdev);

	snd_soc_unregister_card(card);
	return 0;
J
Jonathan Cameron 已提交
87
}
88 89 90 91 92 93 94 95 96 97 98

static struct platform_driver imote2_driver = {
	.driver		= {
		.name	= "imote2-audio",
		.owner	= THIS_MODULE,
	},
	.probe		= imote2_probe,
	.remove		= __devexit_p(imote2_remove),
};

module_platform_driver(imote2_driver);
J
Jonathan Cameron 已提交
99 100 101 102

MODULE_AUTHOR("Jonathan Cameron");
MODULE_DESCRIPTION("ALSA SoC Imote 2");
MODULE_LICENSE("GPL");
103
MODULE_ALIAS("platform:imote2-audio");