OSDN Git Service

ASoC: Intel: Skylake: Add flag to check to register FE dais from topology
authorGuneshwor Singh <guneshwor.o.singh@intel.com>
Mon, 9 Oct 2017 05:50:30 +0000 (11:20 +0530)
committerMark Brown <broonie@kernel.org>
Fri, 13 Oct 2017 19:25:03 +0000 (20:25 +0100)
Since FE dais can come from topology, split the FE dais from existing
dai array so that FE dais need not be registered if they come from
topology. Add use_tplg_pcm flag to check whether FE dais will be
registered from topology during dai driver component registration.

Signed-off-by: Guneshwor Singh <guneshwor.o.singh@intel.com>
Acked-By: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/skylake/skl-pcm.c
sound/soc/intel/skylake/skl.c
sound/soc/intel/skylake/skl.h

index 2b1e513..9ca69b1 100644 (file)
@@ -652,7 +652,7 @@ static const struct snd_soc_dai_ops skl_link_dai_ops = {
        .trigger = skl_link_pcm_trigger,
 };
 
-static struct snd_soc_dai_driver skl_platform_dai[] = {
+static struct snd_soc_dai_driver skl_fe_dai[] = {
 {
        .name = "System Pin",
        .ops = &skl_pcm_dai_ops,
@@ -796,8 +796,10 @@ static struct snd_soc_dai_driver skl_platform_dai[] = {
                .sig_bits = 32,
        },
 },
+};
 
 /* BE CPU  Dais */
+static struct snd_soc_dai_driver skl_platform_dai[] = {
 {
        .name = "SSP0 Pin",
        .ops = &skl_be_ssp_dai_ops,
@@ -1362,6 +1364,8 @@ int skl_platform_register(struct device *dev)
        int ret;
        struct hdac_ext_bus *ebus = dev_get_drvdata(dev);
        struct skl *skl = ebus_to_skl(ebus);
+       struct snd_soc_dai_driver *dais;
+       int num_dais = ARRAY_SIZE(skl_platform_dai);
 
        INIT_LIST_HEAD(&skl->ppl_list);
        INIT_LIST_HEAD(&skl->bind_list);
@@ -1371,14 +1375,38 @@ int skl_platform_register(struct device *dev)
                dev_err(dev, "soc platform registration failed %d\n", ret);
                return ret;
        }
+
+       skl->dais = kmemdup(skl_platform_dai, sizeof(skl_platform_dai),
+                           GFP_KERNEL);
+       if (!skl->dais) {
+               ret = -ENOMEM;
+               goto err;
+       }
+
+       if (!skl->use_tplg_pcm) {
+               dais = krealloc(skl->dais, sizeof(skl_fe_dai) +
+                               sizeof(skl_platform_dai), GFP_KERNEL);
+               if (!dais) {
+                       ret = -ENOMEM;
+                       goto err;
+               }
+
+               skl->dais = dais;
+               memcpy(&skl->dais[ARRAY_SIZE(skl_platform_dai)], skl_fe_dai,
+                      sizeof(skl_fe_dai));
+               num_dais += ARRAY_SIZE(skl_fe_dai);
+       }
+
        ret = snd_soc_register_component(dev, &skl_component,
-                               skl_platform_dai,
-                               ARRAY_SIZE(skl_platform_dai));
+                                        skl->dais, num_dais);
        if (ret) {
                dev_err(dev, "soc component registration failed %d\n", ret);
-               snd_soc_unregister_platform(dev);
+               goto err;
        }
 
+       return 0;
+err:
+       snd_soc_unregister_platform(dev);
        return ret;
 
 }
@@ -1398,5 +1426,7 @@ int skl_platform_unregister(struct device *dev)
 
        snd_soc_unregister_component(dev);
        snd_soc_unregister_platform(dev);
+       kfree(skl->dais);
+
        return 0;
 }
index f94b484..143ade3 100644 (file)
@@ -462,8 +462,11 @@ static int skl_machine_device_register(struct skl *skl, void *driver_data)
                return -EIO;
        }
 
-       if (mach->pdata)
+       if (mach->pdata) {
+               skl->use_tplg_pcm =
+                       ((struct skl_machine_pdata *)mach->pdata)->use_tplg_pcm;
                dev_set_drvdata(&pdev->dev, mach->pdata);
+       }
 
        skl->i2s_dev = pdev;
 
@@ -900,6 +903,9 @@ static struct sst_codecs kbl_5663_5514_codecs = {
        .codecs = {"10EC5663", "10EC5514"}
 };
 
+static struct skl_machine_pdata cnl_pdata = {
+       .use_tplg_pcm = true,
+};
 
 static struct sst_acpi_mach sst_skl_devdata[] = {
        {
@@ -1003,6 +1009,7 @@ static const struct sst_acpi_mach sst_cnl_devdata[] = {
                .id = "INT34C2",
                .drv_name = "cnl_rt274",
                .fw_filename = "intel/dsp_fw_cnl.bin",
+               .pdata = &cnl_pdata,
        },
 };
 
index 8d9d689..e00cde8 100644 (file)
@@ -53,6 +53,7 @@ struct skl {
        struct platform_device *dmic_dev;
        struct platform_device *i2s_dev;
        struct snd_soc_platform *platform;
+       struct snd_soc_dai_driver *dais;
 
        struct nhlt_acpi_table *nhlt; /* nhlt ptr */
        struct skl_sst *skl_sst; /* sst skl ctx */
@@ -73,6 +74,7 @@ struct skl {
        struct skl_debug *debugfs;
        u8 nr_modules;
        struct skl_module **modules;
+       bool use_tplg_pcm;
 };
 
 #define skl_to_ebus(s) (&(s)->ebus)
@@ -85,9 +87,9 @@ struct skl_dma_params {
        u8 stream_tag;
 };
 
-/* to pass dmic data */
 struct skl_machine_pdata {
        u32 dmic_num;
+       bool use_tplg_pcm; /* use dais and dai links from topology */
 };
 
 struct skl_dsp_ops {