Audio: add dev_pm_ops to machine driver, fix soc suspend/resume error.
[firefly-linux-kernel-4.4.55.git] / sound / soc / rockchip / rk_wm8994.c
index df0a8e65c17aa91723ff10fb8408737ecdda5642..b69b2b38554d102b59e351a2367e415d27da6fb1 100755 (executable)
 
 #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
@@ -37,41 +39,26 @@ static int rk29_aif1_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 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:
@@ -325,12 +312,7 @@ static int rk29_wm8994_init(struct snd_soc_pcm_runtime *rtd)
 //     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 */
@@ -379,13 +361,6 @@ static struct snd_soc_dai_link rk29_dai[] = {
        {
                .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,
@@ -393,57 +368,67 @@ static struct snd_soc_dai_link rk29_dai[] = {
        {
                .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");