imote2.c 2.4 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 52 53 54 55 56 57 58 59 60 61 62 63 64 65
	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;
	}

	/* set codec DAI configuration */
	ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S
				  | SND_SOC_DAIFMT_NB_NF
				  | SND_SOC_DAIFMT_CBS_CFS);
	if (ret < 0)
		return ret;

	/* CPU should be clock master */
	ret = snd_soc_dai_set_fmt(cpu_dai,  SND_SOC_DAIFMT_I2S
				  | SND_SOC_DAIFMT_NB_NF
				  | SND_SOC_DAIFMT_CBS_CFS);
	if (ret < 0)
		return ret;

	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",
66
	.cpu_dai_name = "pxa2xx-i2s",
67 68 69
	.codec_dai_name = "wm8940-hifi",
	.platform_name = "pxa-pcm-audio",
	.codec_name = "wm8940-codec.0-0034",
J
Jonathan Cameron 已提交
70 71 72
	.ops = &imote2_asoc_ops,
};

73
static struct snd_soc_card imote2 = {
J
Jonathan Cameron 已提交
74 75 76 77 78
	.name = "Imote2",
	.dai_link = &imote2_dai,
	.num_links = 1,
};

79
static int __devinit imote2_probe(struct platform_device *pdev)
J
Jonathan Cameron 已提交
80
{
81
	struct snd_soc_card *card = &imote2;
J
Jonathan Cameron 已提交
82 83
	int ret;

84
	card->dev = &pdev->dev;
J
Jonathan Cameron 已提交
85

86
	ret = snd_soc_register_card(card);
J
Jonathan Cameron 已提交
87
	if (ret)
88 89
		dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
			ret);
J
Jonathan Cameron 已提交
90 91 92
	return ret;
}

93
static int __devexit imote2_remove(struct platform_device *pdev)
J
Jonathan Cameron 已提交
94
{
95 96 97 98
	struct snd_soc_card *card = platform_get_drvdata(pdev);

	snd_soc_unregister_card(card);
	return 0;
J
Jonathan Cameron 已提交
99
}
100 101 102 103 104 105 106 107 108 109 110

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 已提交
111 112 113 114

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