ASoC: meson: axg-toddr: add sm1 support
authorJerome Brunet <jbrunet@baylibre.com>
Thu, 5 Sep 2019 12:01:19 +0000 (14:01 +0200)
committerMark Brown <broonie@kernel.org>
Thu, 5 Sep 2019 17:17:49 +0000 (18:17 +0100)
On sm1, the maximum number TODDR inputs is extended to 16.

Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
Link: https://lore.kernel.org/r/20190905120120.31752-8-jbrunet@baylibre.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/meson/axg-toddr.c

index 2e9a2e5..c8ea214 100644 (file)
@@ -25,6 +25,7 @@
 #define CTRL0_TODDR_LSB_POS_MASK       GENMASK(7, 3)
 #define CTRL0_TODDR_LSB_POS(x)         ((x) << 3)
 #define CTRL1_TODDR_FORCE_FINISH       BIT(25)
+#define CTRL1_SEL_SHIFT                        28
 
 #define TODDR_MSB_POS  31
 
@@ -221,6 +222,70 @@ static const struct axg_fifo_match_data g12a_toddr_match_data = {
        .dai_drv        = &g12a_toddr_dai_drv
 };
 
+static const char * const sm1_toddr_sel_texts[] = {
+       "IN 0", "IN 1", "IN 2",  "IN 3",  "IN 4",  "IN 5",  "IN 6",  "IN 7",
+       "IN 8", "IN 9", "IN 10", "IN 11", "IN 12", "IN 13", "IN 14", "IN 15"
+};
+
+static SOC_ENUM_SINGLE_DECL(sm1_toddr_sel_enum, FIFO_CTRL1, CTRL1_SEL_SHIFT,
+                           sm1_toddr_sel_texts);
+
+static const struct snd_kcontrol_new sm1_toddr_in_mux =
+       SOC_DAPM_ENUM("Input Source", sm1_toddr_sel_enum);
+
+static const struct snd_soc_dapm_widget sm1_toddr_dapm_widgets[] = {
+       SND_SOC_DAPM_MUX("SRC SEL", SND_SOC_NOPM, 0, 0, &sm1_toddr_in_mux),
+       SND_SOC_DAPM_AIF_IN("IN 0",  NULL, 0, SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_AIF_IN("IN 1",  NULL, 0, SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_AIF_IN("IN 2",  NULL, 0, SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_AIF_IN("IN 3",  NULL, 0, SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_AIF_IN("IN 4",  NULL, 0, SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_AIF_IN("IN 5",  NULL, 0, SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_AIF_IN("IN 6",  NULL, 0, SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_AIF_IN("IN 7",  NULL, 0, SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_AIF_IN("IN 8",  NULL, 0, SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_AIF_IN("IN 9",  NULL, 0, SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_AIF_IN("IN 10", NULL, 0, SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_AIF_IN("IN 11", NULL, 0, SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_AIF_IN("IN 12", NULL, 0, SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_AIF_IN("IN 13", NULL, 0, SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_AIF_IN("IN 14", NULL, 0, SND_SOC_NOPM, 0, 0),
+       SND_SOC_DAPM_AIF_IN("IN 15", NULL, 0, SND_SOC_NOPM, 0, 0),
+};
+
+static const struct snd_soc_dapm_route sm1_toddr_dapm_routes[] = {
+       { "Capture", NULL, "SRC SEL" },
+       { "SRC SEL", "IN 0",  "IN 0" },
+       { "SRC SEL", "IN 1",  "IN 1" },
+       { "SRC SEL", "IN 2",  "IN 2" },
+       { "SRC SEL", "IN 3",  "IN 3" },
+       { "SRC SEL", "IN 4",  "IN 4" },
+       { "SRC SEL", "IN 5",  "IN 5" },
+       { "SRC SEL", "IN 6",  "IN 6" },
+       { "SRC SEL", "IN 7",  "IN 7" },
+       { "SRC SEL", "IN 8",  "IN 8" },
+       { "SRC SEL", "IN 9",  "IN 9" },
+       { "SRC SEL", "IN 10", "IN 10" },
+       { "SRC SEL", "IN 11", "IN 11" },
+       { "SRC SEL", "IN 12", "IN 12" },
+       { "SRC SEL", "IN 13", "IN 13" },
+       { "SRC SEL", "IN 14", "IN 14" },
+       { "SRC SEL", "IN 15", "IN 15" },
+};
+
+static const struct snd_soc_component_driver sm1_toddr_component_drv = {
+       .dapm_widgets           = sm1_toddr_dapm_widgets,
+       .num_dapm_widgets       = ARRAY_SIZE(sm1_toddr_dapm_widgets),
+       .dapm_routes            = sm1_toddr_dapm_routes,
+       .num_dapm_routes        = ARRAY_SIZE(sm1_toddr_dapm_routes),
+       .ops                    = &g12a_fifo_pcm_ops
+};
+
+static const struct axg_fifo_match_data sm1_toddr_match_data = {
+       .component_drv  = &sm1_toddr_component_drv,
+       .dai_drv        = &g12a_toddr_dai_drv
+};
+
 static const struct of_device_id axg_toddr_of_match[] = {
        {
                .compatible = "amlogic,axg-toddr",
@@ -228,6 +293,9 @@ static const struct of_device_id axg_toddr_of_match[] = {
        }, {
                .compatible = "amlogic,g12a-toddr",
                .data = &g12a_toddr_match_data,
+       }, {
+               .compatible = "amlogic,sm1-toddr",
+               .data = &sm1_toddr_match_data,
        }, {}
 };
 MODULE_DEVICE_TABLE(of, axg_toddr_of_match);