dt-bindings: add document for Rockchip RGA module
[firefly-linux-kernel-4.4.55.git] / sound / soc / rockchip / rk_rk3026.c
index 8e937ec9a6fb275cba7b76c3fe0a8dcc77753dd3..dfca69ff7f9008c3872d3b67ba8218a160554ebf 100644 (file)
@@ -21,8 +21,9 @@
 #include <sound/soc-dapm.h>
 
 #include "../codecs/rk3026_codec.h"
+#include "card_info.h"
 #include "rk_pcm.h"
-#include "rk29_i2s.h"
+#include "rk_i2s.h"
 
 #if 0
 #define        DBG(x...)       printk(KERN_INFO x)
@@ -68,20 +69,15 @@ static int rk3026_init(struct snd_soc_pcm_runtime *rtd)
 
        DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
 
-       snd_soc_add_codec_controls(codec, rk_controls,
-                       ARRAY_SIZE(rk_controls));
-
-       /* Add specific widgets */
-       snd_soc_dapm_new_controls(dapm, rk_dapm_widgets,
-                                 ARRAY_SIZE(rk_dapm_widgets));
-       /* Set up specific audio path audio_mapnects */
-       snd_soc_dapm_add_routes(dapm, rk_audio_map, ARRAY_SIZE(rk_audio_map));
+       mutex_lock(&dapm->card->dapm_mutex);
 
        snd_soc_dapm_enable_pin(dapm, "Mic Jack");
        snd_soc_dapm_enable_pin(dapm, "Headset Jack");
        snd_soc_dapm_enable_pin(dapm, "Ext Spk");
        snd_soc_dapm_enable_pin(dapm, "Headphone Jack");
 
+       mutex_unlock(&dapm->card->dapm_mutex);
+
        snd_soc_dapm_sync(dapm);
 
        return 0;
@@ -93,36 +89,24 @@ static int rk_hifi_hw_params(struct snd_pcm_substream *substream,
        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 ret;
 
-       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)
-
-       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 );
-       #endif
-       if (ret < 0)
+       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)
-       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);
-       #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:
@@ -167,10 +151,17 @@ static int rk_voice_hw_params(struct snd_pcm_substream *substream,
        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 ret;
 
-       DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
+       DBG("Enter::%s----%d\n", __FUNCTION__, __LINE__);
+
+       /* set codec DAI configuration */
+       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 codec DAI configuration */
        ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_DSP_A |
@@ -220,13 +211,6 @@ static struct snd_soc_dai_link rk_dai[] = {
        {
                .name = "RK3026 I2S1",
                .stream_name = "RK3026 PCM",
-               .codec_name = "rk3026-codec",
-               .platform_name = "rockchip-pcm",
-#if defined(CONFIG_SND_RK_SOC_I2S_8CH)
-               .cpu_dai_name = "rockchip-i2s.0",
-#elif defined(CONFIG_SND_RK_SOC_I2S_2CH)
-               .cpu_dai_name = "rockchip-i2s.1",
-#endif
                .codec_dai_name = "rk3026-hifi",
                .init = rk3026_init,
                .ops = &rk3026_hifi_ops,
@@ -234,13 +218,6 @@ static struct snd_soc_dai_link rk_dai[] = {
        {
                .name = "RK3026 I2S2",
                .stream_name = "RK3026 PCM",
-               .codec_name = "rk3026-codec",
-               .platform_name = "rockchip-pcm",
-#if defined(CONFIG_SND_RK_SOC_I2S_8CH)
-               .cpu_dai_name = "rockchip-i2s.0",
-#elif defined(CONFIG_SND_RK_SOC_I2S_2CH)
-               .cpu_dai_name = "rockchip-i2s.1",
-#endif
                .codec_dai_name = "rk3026-voice",
                .ops = &rk3026_voice_ops,
        },
@@ -250,6 +227,12 @@ static struct snd_soc_card rockchip_rk3026_snd_card = {
        .name = "RK_RK3026",
        .dai_link = rk_dai,
        .num_links = 2,
+       .controls = rk_controls,
+       .num_controls = ARRAY_SIZE(rk_controls),
+       .dapm_widgets    = rk_dapm_widgets,
+       .num_dapm_widgets = ARRAY_SIZE(rk_dapm_widgets),
+       .dapm_routes    = rk_audio_map,
+       .num_dapm_routes = ARRAY_SIZE(rk_audio_map),
 };
 
 static int rockchip_rk3026_audio_probe(struct platform_device *pdev)
@@ -259,8 +242,13 @@ static int rockchip_rk3026_audio_probe(struct platform_device *pdev)
 
        card->dev = &pdev->dev;
 
-       ret = snd_soc_register_card(card);
+       ret = rockchip_of_get_sound_card_info(card);
+       if (ret) {
+               printk("%s() get sound card info failed:%d\n", __FUNCTION__, ret);
+               return ret;
+       }
 
+       ret = snd_soc_register_card(card);
        if (ret)
                printk("%s() register card failed:%d\n", __FUNCTION__, ret);
 
@@ -278,20 +266,21 @@ static int rockchip_rk3026_audio_remove(struct platform_device *pdev)
 
 #ifdef CONFIG_OF
 static const struct of_device_id rockchip_rk3026_of_match[] = {
-        { .compatible = "rockchip-rk3026", },
-        {},
+       { .compatible = "rockchip-rk3026", },
+       {},
 };
 MODULE_DEVICE_TABLE(of, rockchip_rk3026_of_match);
 #endif /* CONFIG_OF */
 
 static struct platform_driver rockchip_rk3026_audio_driver = {
-        .driver         = {
-                .name   = "rockchip-rk3026",
-                .owner  = THIS_MODULE,
-                .of_match_table = of_match_ptr(rockchip_rk3026_of_match),
-        },
-        .probe          = rockchip_rk3026_audio_probe,
-        .remove         = rockchip_rk3026_audio_remove,
+       .driver         = {
+               .name   = "rockchip-rk3026",
+               .owner  = THIS_MODULE,
+               .pm = &snd_soc_pm_ops,
+               .of_match_table = of_match_ptr(rockchip_rk3026_of_match),
+       },
+       .probe          = rockchip_rk3026_audio_probe,
+       .remove         = rockchip_rk3026_audio_remove,
 };
 
 module_platform_driver(rockchip_rk3026_audio_driver);