#include <linux/module.h>
#include <linux/device.h>
+#include <linux/of.h>
+#include <linux/of_gpio.h>
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/soc.h>
#include <sound/soc-dapm.h>
-#include <asm/io.h>
-#include <mach/hardware.h>
+
#include "../codecs/wm8994.h"
+#include "card_info.h"
#include "rk_pcm.h"
-#include "rk29_i2s.h"
+#include "rk_i2s.h"
#include <linux/clk.h>
#if 0
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct snd_soc_dai *codec_dai = rtd->codec_dai;
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
- unsigned int pll_out = 0;
+ unsigned int pll_out = 0, dai_fmt = rtd->dai_link->dai_fmt;
int div_bclk,div_mclk;
int ret;
struct clk *general_pll;
-
- DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
+ DBG("Enter::%s----%d\n", __FUNCTION__, __LINE__);
/* set codec DAI configuration */
-#if defined (CONFIG_SND_RK_CODEC_SOC_SLAVE)
- DBG("Set codec_dai slave\n");
- ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
- SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS);
-#endif
-#if defined (CONFIG_SND_RK_CODEC_SOC_MASTER)
- ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
- SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM);
- DBG("Set codec_dai master\n");
-#endif
- if (ret < 0)
- return ret;
+ ret = snd_soc_dai_set_fmt(codec_dai, dai_fmt);
+ if (ret < 0) {
+ printk("%s():failed to set the format for codec side\n", __FUNCTION__);
+ return ret;
+ }
/* set cpu DAI configuration */
-#if defined (CONFIG_SND_RK_CODEC_SOC_SLAVE)
- DBG("Set cpu_dai master\n");
- ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
- SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM);
-#endif
-#if defined (CONFIG_SND_RK_CODEC_SOC_MASTER)
- ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
- SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS);
- DBG("Set cpu_dai slave\n");
-#endif
- if (ret < 0)
+ ret = snd_soc_dai_set_fmt(cpu_dai, dai_fmt);
+ if (ret < 0) {
+ printk("%s():failed to set the format for cpu side\n", __FUNCTION__);
return ret;
+ }
switch(params_rate(params)) {
case 8000:
// snd_soc_dapm_nc_pin(dapm, "LINEOUT1P");
snd_soc_dapm_nc_pin(dapm, "LINEOUT2N");
snd_soc_dapm_nc_pin(dapm, "LINEOUT2P");
-#ifdef CONFIG_HDMI
-extern int hdmi_is_insert(void);
-extern void codec_set_spk(bool on);
- if(hdmi_is_insert())
- codec_set_spk(false);
-#endif
+
snd_soc_dapm_sync(dapm);
/* Headset jack detection */
{
.name = "WM8994 I2S1",
.stream_name = "WM8994 PCM",
- .codec_name = "wm8994-codec",
- .platform_name = "rockchip-audio",
-#if defined(CONFIG_SND_RK_SOC_I2S_8CH)
- .cpu_dai_name = "rk_i2s.0",
-#elif defined(CONFIG_SND_RK_SOC_I2S_2CH)
- .cpu_dai_name = "rk_i2s.1",
-#endif
.codec_dai_name = "wm8994-aif1",
.ops = &rk29_aif1_ops,
.init = rk29_wm8994_init,
{
.name = "WM8994 I2S2",
.stream_name = "WM8994 PCM",
- .codec_name = "wm8994-codec",
- .platform_name = "rockchip-audio",
-#if defined(CONFIG_SND_RK_SOC_I2S_8CH)
- .cpu_dai_name = "rk_i2s.0",
-#elif defined(CONFIG_SND_RK_SOC_I2S_2CH)
- .cpu_dai_name = "rk_i2s.1",
-#endif
.codec_dai_name = "wm8994-aif2",
.ops = &rk29_aif2_ops,
},
};
-static struct snd_soc_card snd_soc_card_rk29 = {
+static struct snd_soc_card rockchip_wm8994_snd_card = {
.name = "RK_WM8994",
.dai_link = rk29_dai,
.num_links = ARRAY_SIZE(rk29_dai),
};
-static struct platform_device *rk29_snd_device;
-
-static int __init audio_card_init(void)
+static int rockchip_wm8994_audio_probe(struct platform_device *pdev)
{
- int ret =0;
+ int ret;
+ struct snd_soc_card *card = &rockchip_wm8994_snd_card;
- DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
+ card->dev = &pdev->dev;
- rk29_snd_device = platform_device_alloc("soc-audio", -1);
- if (!rk29_snd_device) {
- printk("platform device allocation failed\n");
- return -ENOMEM;
- }
-
- platform_set_drvdata(rk29_snd_device, &snd_soc_card_rk29);
- ret = platform_device_add(rk29_snd_device);
+ ret = rockchip_of_get_sound_card_info(card);
if (ret) {
- printk("platform device add failed\n");
- // snd_soc_unregister_dai(&rk29_snd_device->dev);
- platform_device_put(rk29_snd_device);
+ printk("%s() get sound card info failed:%d\n", __FUNCTION__, ret);
return ret;
}
-
- return ret;
+
+ ret = snd_soc_register_card(card);
+ if (ret)
+ printk("%s() register card failed:%d\n", __FUNCTION__, ret);
+
+ return ret;
}
-static void __exit audio_card_exit(void)
+static int rockchip_wm8994_audio_remove(struct platform_device *pdev)
{
- platform_device_unregister(rk29_snd_device);
+ struct snd_soc_card *card = platform_get_drvdata(pdev);
+
+ snd_soc_unregister_card(card);
+
+ return 0;
}
-module_init(audio_card_init);
-module_exit(audio_card_exit);
+#ifdef CONFIG_OF
+static const struct of_device_id rockchip_wm8994_of_match[] = {
+ { .compatible = "rockchip-wm8994", },
+ {},
+};
+MODULE_DEVICE_TABLE(of, rockchip_wm8994_of_match);
+#endif /* CONFIG_OF */
+
+static struct platform_driver rockchip_wm8994_audio_driver = {
+ .driver = {
+ .name = "rockchip-wm8994",
+ .owner = THIS_MODULE,
+ .pm = &snd_soc_pm_ops,
+ .of_match_table = of_match_ptr(rockchip_wm8994_of_match),
+ },
+ .probe = rockchip_wm8994_audio_probe,
+ .remove = rockchip_wm8994_audio_remove,
+};
+
+module_platform_driver(rockchip_wm8994_audio_driver);
+
/* Module information */
MODULE_AUTHOR("rockchip");
MODULE_DESCRIPTION("ROCKCHIP i2s ASoC Interface");