]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ASoC: mediatek: add sub dai to mtk_base_afe
authorKaiChieh Chuang <kaichieh.chuang@mediatek.com>
Fri, 25 May 2018 03:48:16 +0000 (11:48 +0800)
committerMark Brown <broonie@kernel.org>
Fri, 25 May 2018 17:34:46 +0000 (18:34 +0100)
In MediaTek SoC chip we have multiple DAI,
such as I2S, ADDA, PCM, etc.

Organize each DAI in to one sub dai,
with its dai driver, controls, widgets, routes.

add mtk_afe_combine_sub_dai() to combine
dai driver from each DAI.

add mtk_afe_add_sub_dai_control() to register
the control, widget, routes to component.

Signed-off-by: KaiChieh Chuang <kaichieh.chuang@mediatek.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/mediatek/common/mtk-afe-platform-driver.c
sound/soc/mediatek/common/mtk-afe-platform-driver.h
sound/soc/mediatek/common/mtk-base-afe.h

index 8966ee1383871bafd7d3dbe551c914a5c155b55b..c4491883090d2919c960fa7d32948dd1b5062cd5 100644 (file)
 #include "mtk-afe-platform-driver.h"
 #include "mtk-base-afe.h"
 
+int mtk_afe_combine_sub_dai(struct mtk_base_afe *afe)
+{
+       struct snd_soc_dai_driver *sub_dai_drivers;
+       size_t num_dai_drivers = 0, dai_idx = 0;
+       int i;
+
+       if (!afe->sub_dais) {
+               dev_err(afe->dev, "%s(), sub_dais == NULL\n", __func__);
+               return -EINVAL;
+       }
+
+       /* calcualte total dai driver size */
+       for (i = 0; i < afe->num_sub_dais; i++) {
+               if (afe->sub_dais[i].dai_drivers &&
+                   afe->sub_dais[i].num_dai_drivers != 0)
+                       num_dai_drivers += afe->sub_dais[i].num_dai_drivers;
+       }
+
+       dev_info(afe->dev, "%s(), num of dai %zd\n", __func__, num_dai_drivers);
+
+       /* combine sub_dais */
+       afe->num_dai_drivers = num_dai_drivers;
+       afe->dai_drivers = devm_kcalloc(afe->dev,
+                                       num_dai_drivers,
+                                       sizeof(struct snd_soc_dai_driver),
+                                       GFP_KERNEL);
+       if (!afe->dai_drivers)
+               return -ENOMEM;
+
+       for (i = 0; i < afe->num_sub_dais; i++) {
+               if (afe->sub_dais[i].dai_drivers &&
+                   afe->sub_dais[i].num_dai_drivers != 0) {
+                       sub_dai_drivers = afe->sub_dais[i].dai_drivers;
+                       /* dai driver */
+                       memcpy(&afe->dai_drivers[dai_idx],
+                              sub_dai_drivers,
+                              afe->sub_dais[i].num_dai_drivers *
+                              sizeof(struct snd_soc_dai_driver));
+                       dai_idx += afe->sub_dais[i].num_dai_drivers;
+               }
+       }
+
+       return 0;
+}
+
+int mtk_afe_add_sub_dai_control(struct snd_soc_component *component)
+{
+       struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
+       int i;
+
+       if (!afe->sub_dais) {
+               dev_err(afe->dev, "%s(), sub_dais == NULL\n", __func__);
+               return -EINVAL;
+       }
+
+       for (i = 0; i < afe->num_sub_dais; i++) {
+               if (afe->sub_dais[i].controls)
+                       snd_soc_add_component_controls(component,
+                               afe->sub_dais[i].controls,
+                               afe->sub_dais[i].num_controls);
+
+               if (afe->sub_dais[i].dapm_widgets)
+                       snd_soc_dapm_new_controls(&component->dapm,
+                               afe->sub_dais[i].dapm_widgets,
+                               afe->sub_dais[i].num_dapm_widgets);
+
+               if (afe->sub_dais[i].dapm_routes)
+                       snd_soc_dapm_add_routes(&component->dapm,
+                               afe->sub_dais[i].dapm_routes,
+                               afe->sub_dais[i].num_dapm_routes);
+       }
+
+       snd_soc_dapm_new_widgets(component->dapm.card);
+
+       return 0;
+
+}
+
 static snd_pcm_uframes_t mtk_afe_pcm_pointer
                         (struct snd_pcm_substream *substream)
 {
index 1c81d911cf2aba4545829304629298bf89a39ae2..0c31fa4b6f8c31b4faf1ff4aed8940b33db4c673 100644 (file)
 #define AFE_PCM_NAME "mtk-afe-pcm"
 extern const struct snd_soc_component_driver mtk_afe_pcm_platform;
 
+struct mtk_base_afe;
+struct snd_soc_component;
+
+int mtk_afe_combine_sub_dai(struct mtk_base_afe *afe);
+int mtk_afe_add_sub_dai_control(struct snd_soc_component *component);
 #endif
 
index c2c5a6c5751db30f3351ba59e6d499025036bfa2..bcf562f029b648dcae555b4a99bce90aaa8defaf 100644 (file)
@@ -48,6 +48,7 @@ struct mtk_base_irq_data {
 struct device;
 struct mtk_base_afe_memif;
 struct mtk_base_afe_irq;
+struct mtk_base_afe_dai;
 struct regmap;
 struct snd_pcm_substream;
 struct snd_soc_dai;
@@ -71,6 +72,11 @@ struct mtk_base_afe {
        struct mtk_base_afe_irq *irqs;
        int irqs_size;
 
+       struct mtk_base_afe_dai *sub_dais;
+       int num_sub_dais;
+       struct snd_soc_dai_driver *dai_drivers;
+       unsigned int num_dai_drivers;
+
        const struct snd_pcm_hardware *mtk_afe_hardware;
        int (*memif_fs)(struct snd_pcm_substream *substream,
                        unsigned int rate);
@@ -94,5 +100,17 @@ struct mtk_base_afe_irq {
        int irq_occupyed;
 };
 
+struct mtk_base_afe_dai {
+       struct snd_soc_dai_driver *dai_drivers;
+       unsigned int num_dai_drivers;
+
+       const struct snd_kcontrol_new *controls;
+       unsigned int num_controls;
+       const struct snd_soc_dapm_widget *dapm_widgets;
+       unsigned int num_dapm_widgets;
+       const struct snd_soc_dapm_route *dapm_routes;
+       unsigned int num_dapm_routes;
+};
+
 #endif