/ {
sound: sound {
compatible = "simple-audio-card";
simple-audio-card,name = "Odroid-XU4";
simple-audio-card,widgets =
"Headphone", "Headphone Jack";
simple-audio-card,routing =
"Headphone Jack", "HPL",
"Headphone Jack", "HPR";
simple-audio-card,format = "i2s";
simple-audio-card,bitclock-master = <&link0_codec>;
simple-audio-card,frame-master = <&link0_codec>;
simple-audio-card,cpu {
sound-dai = <&i2s0 0>;
system-clock-frequency = <19200000>;
};
link0_codec: simple-audio-card,codec {
sound-dai = <&cs4344>;
clocks = <&i2s0 CLK_I2S_CDCLK>;
};
};
cs4344: cs4344@10 {
compatible = "cirrus,cs4344";
clocks = <&i2s0 CLK_I2S_CDCLK>;
clock-names = "mclk";
#sound-dai-cells = <0>;
status = "okay";
};
};
==============================================
CODEC PART:
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/device.h>
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/ac97_codec.h>
#include <sound/initval.h>
#include <sound/soc.h>
#include "cs4344.h"
static const struct snd_soc_dapm_widget cs4344_dapm_widgets[] = {
SND_SOC_DAPM_OUTPUT("HPL"),
SND_SOC_DAPM_OUTPUT("HPR"),
};
static const struct snd_soc_dapm_route cs4344_dapm_routes[] = {
{ "HPL", NULL, "Playback" },
{ "HPR", NULL, "Playback" },
};
static struct snd_soc_dai_driver cs4344_dai = {
.name = "cs4344",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
.channels_max = 2,
.rates= SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | \
SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \
SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | \
SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000,
.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE,
},
};
static struct snd_soc_codec_driver soc_codec_dev_cs4344 = {
.dapm_widgets = cs4344_dapm_widgets,
.num_dapm_widgets = ARRAY_SIZE(cs4344_dapm_widgets),
.dapm_routes = cs4344_dapm_routes,
.num_dapm_routes = ARRAY_SIZE(cs4344_dapm_routes),
};
static int cs4344_probe(struct platform_device *pdev){
printk ("****** probe cs4344 ******\n");
return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_cs4344, &cs4344_dai, 1);
}
static int cs4344_remove(struct platform_device *pdev){
printk ("****** remove cs4344 ******\n");
snd_soc_unregister_codec(&pdev->dev);
return 0;
}
static const struct of_device_id cs4344_of_match[] = {
{ .compatible = "cirrus,cs4344", },
{ }
};
MODULE_DEVICE_TABLE(of, cs4344_of_match);
static struct platform_driver cs4344_codec_driver = {
.driver = {
.name = "cs4344",
.of_match_table = of_match_ptr(cs4344_of_match),
},
.probe = cs4344_probe,
};
module_platform_driver(cs4344_codec_driver);
MODULE_DESCRIPTION("ASoC cs4344 driver");
MODULE_AUTHOR("xyz");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:cs4344");