ASoC: Intel: board: Add Geminilake platform support
authorPradeep Tewani <pradeep.d.tewani@intel.com>
Thu, 20 Jul 2017 06:10:57 +0000 (11:40 +0530)
committerMark Brown <broonie@kernel.org>
Thu, 20 Jul 2017 11:20:39 +0000 (12:20 +0100)
Geminilake also features rt298 codec, so use the same machine driver
as Broxton. Geminilake uses SSP2 instead of SSP5.

Signed-off-by: Pradeep Tewani <pradeep.d.tewani@intel.com>
Acked-By: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/boards/bxt_rt298.c

index 1daf98ef9d2810c5dcf81ae5543695ecc0996c32..a4b5bcb1f6f8c332d0084abe9fafe65332562668 100644 (file)
@@ -114,7 +114,44 @@ static const struct snd_soc_dapm_route broxton_rt298_map[] = {
        { "iDisp2 Tx", NULL, "iDisp2_out"},
        { "hifi1", NULL, "iDisp1 Tx"},
        { "iDisp1 Tx", NULL, "iDisp1_out"},
+};
+
+static const struct snd_soc_dapm_route geminilake_rt298_map[] = {
+       /* speaker */
+       {"Speaker", NULL, "SPOR"},
+       {"Speaker", NULL, "SPOL"},
+
+       /* HP jack connectors - unknown if we have jack detect */
+       {"Headphone Jack", NULL, "HPO Pin"},
+
+       /* other jacks */
+       {"MIC1", NULL, "Mic Jack"},
+
+       /* digital mics */
+       {"DMIC1 Pin", NULL, "DMIC2"},
+       {"DMic", NULL, "SoC DMIC"},
+
+       {"HDMI1", NULL, "hif5-0 Output"},
+       {"HDMI2", NULL, "hif6-0 Output"},
+       {"HDMI2", NULL, "hif7-0 Output"},
+
+       /* CODEC BE connections */
+       { "AIF1 Playback", NULL, "ssp2 Tx"},
+       { "ssp2 Tx", NULL, "codec0_out"},
+       { "ssp2 Tx", NULL, "codec1_out"},
+
+       { "codec0_in", NULL, "ssp2 Rx" },
+       { "ssp2 Rx", NULL, "AIF1 Capture" },
 
+       { "dmic01_hifi", NULL, "DMIC01 Rx" },
+       { "DMIC01 Rx", NULL, "Capture" },
+
+       { "hifi3", NULL, "iDisp3 Tx"},
+       { "iDisp3 Tx", NULL, "iDisp3_out"},
+       { "hifi2", NULL, "iDisp2 Tx"},
+       { "iDisp2 Tx", NULL, "iDisp2_out"},
+       { "hifi1", NULL, "iDisp1 Tx"},
+       { "iDisp1 Tx", NULL, "iDisp1_out"},
 };
 
 static int broxton_rt298_fe_init(struct snd_soc_pcm_runtime *rtd)
@@ -505,9 +542,41 @@ static struct snd_soc_card broxton_rt298 = {
 
 };
 
+static struct snd_soc_card geminilake_rt298 = {
+       .name = "geminilake-rt298",
+       .dai_link = broxton_rt298_dais,
+       .num_links = ARRAY_SIZE(broxton_rt298_dais),
+       .controls = broxton_controls,
+       .num_controls = ARRAY_SIZE(broxton_controls),
+       .dapm_widgets = broxton_widgets,
+       .num_dapm_widgets = ARRAY_SIZE(broxton_widgets),
+       .dapm_routes = geminilake_rt298_map,
+       .num_dapm_routes = ARRAY_SIZE(geminilake_rt298_map),
+       .fully_routed = true,
+       .late_probe = bxt_card_late_probe,
+};
+
 static int broxton_audio_probe(struct platform_device *pdev)
 {
        struct bxt_rt286_private *ctx;
+       struct snd_soc_card *card =
+                       (struct snd_soc_card *)pdev->id_entry->driver_data;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(broxton_rt298_dais); i++) {
+               if (!strncmp(card->dai_link[i].codec_name, "i2c-INT343A:00",
+                                               I2C_NAME_SIZE)) {
+                       if (!strncmp(card->name, "broxton-rt298",
+                                               PLATFORM_NAME_SIZE)) {
+                               card->dai_link[i].name = "SSP5-Codec";
+                               card->dai_link[i].cpu_dai_name = "SSP5 Pin";
+                       } else if (!strncmp(card->name, "geminilake-rt298",
+                                               PLATFORM_NAME_SIZE)) {
+                               card->dai_link[i].name = "SSP2-Codec";
+                               card->dai_link[i].cpu_dai_name = "SSP2 Pin";
+                       }
+               }
+       }
 
        ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_ATOMIC);
        if (!ctx)
@@ -515,18 +584,26 @@ static int broxton_audio_probe(struct platform_device *pdev)
 
        INIT_LIST_HEAD(&ctx->hdmi_pcm_list);
 
-       broxton_rt298.dev = &pdev->dev;
-       snd_soc_card_set_drvdata(&broxton_rt298, ctx);
+       card->dev = &pdev->dev;
+       snd_soc_card_set_drvdata(card, ctx);
 
-       return devm_snd_soc_register_card(&pdev->dev, &broxton_rt298);
+       return devm_snd_soc_register_card(&pdev->dev, card);
 }
 
+static const struct platform_device_id bxt_board_ids[] = {
+       { .name = "bxt_alc298s_i2s", .driver_data =
+                               (unsigned long)&broxton_rt298 },
+       { .name = "glk_alc298s_i2s", .driver_data =
+                               (unsigned long)&geminilake_rt298 },
+};
+
 static struct platform_driver broxton_audio = {
        .probe = broxton_audio_probe,
        .driver = {
                .name = "bxt_alc298s_i2s",
                .pm = &snd_soc_pm_ops,
        },
+       .id_table = bxt_board_ids,
 };
 module_platform_driver(broxton_audio)
 
@@ -536,3 +613,4 @@ MODULE_AUTHOR("Senthilnathan Veppur <senthilnathanx.veppur@intel.com>");
 MODULE_DESCRIPTION("Intel SST Audio for Broxton");
 MODULE_LICENSE("GPL v2");
 MODULE_ALIAS("platform:bxt_alc298s_i2s");
+MODULE_ALIAS("platform:glk_alc298s_i2s");