From patchwork Wed Apr 11 10:25:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naveen M X-Patchwork-Id: 10335293 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id CCF1460365 for ; Wed, 11 Apr 2018 10:26:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BA67028761 for ; Wed, 11 Apr 2018 10:26:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id AF4D7287A7; Wed, 11 Apr 2018 10:26:19 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00, MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B769128761 for ; Wed, 11 Apr 2018 10:26:18 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id D1C9A2675DA; Wed, 11 Apr 2018 12:26:05 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id DE9522673F2; Wed, 11 Apr 2018 12:25:59 +0200 (CEST) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by alsa0.perex.cz (Postfix) with ESMTP id 866332673F5 for ; Wed, 11 Apr 2018 12:25:57 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 11 Apr 2018 03:25:57 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,435,1517904000"; d="scan'208";a="49888444" Received: from nm-b85m-d3h.iind.intel.com ([10.223.163.12]) by orsmga002.jf.intel.com with ESMTP; 11 Apr 2018 03:25:54 -0700 From: Naveen Manohar To: alsa-devel@alsa-project.org Date: Wed, 11 Apr 2018 15:55:01 +0530 Message-Id: <1523442303-12710-4-git-send-email-naveen.m@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1523442303-12710-1-git-send-email-naveen.m@intel.com> References: <1523442303-12710-1-git-send-email-naveen.m@intel.com> Cc: vinod.koul@intel.com, harshapriya.n@intel.com, naveen.m@intel.com, broonie@kernel.org, pierre-louis.bossart@intel.com Subject: [alsa-devel] [PATCH v2 3/5] ASoC: Intel: Add Geminilake Dialog Maxim machine driver support X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP Patch adds required changes in bxt machine to use MAX98357A codec as speaker on SSP1 & DA7219 codec as headset on SSP2 on GLK board. Signed-off-by: Naveen Manohar --- sound/soc/intel/boards/bxt_da7219_max98357a.c | 124 ++++++++++++++++++++++---- 1 file changed, 108 insertions(+), 16 deletions(-) diff --git a/sound/soc/intel/boards/bxt_da7219_max98357a.c b/sound/soc/intel/boards/bxt_da7219_max98357a.c index 2eff1f0..6c23aaa 100644 --- a/sound/soc/intel/boards/bxt_da7219_max98357a.c +++ b/sound/soc/intel/boards/bxt_da7219_max98357a.c @@ -16,6 +16,7 @@ * GNU General Public License for more details. */ +#include #include #include #include @@ -33,6 +34,7 @@ #define DUAL_CHANNEL 2 #define QUAD_CHANNEL 4 +static struct snd_soc_card *audio_card; static struct snd_soc_jack broxton_headset; static struct snd_soc_jack broxton_hdmi[3]; @@ -103,7 +105,7 @@ static const struct snd_soc_dapm_widget broxton_widgets[] = { platform_clock_control, SND_SOC_DAPM_POST_PMD|SND_SOC_DAPM_PRE_PMU), }; -static const struct snd_soc_dapm_route broxton_map[] = { +static const struct snd_soc_dapm_route audio_map[] = { /* HP jack connectors - unknown if we have jack detection */ {"Headphone Jack", NULL, "HPL"}, {"Headphone Jack", NULL, "HPR"}, @@ -118,15 +120,6 @@ static const struct snd_soc_dapm_route broxton_map[] = { {"DMic", NULL, "SoC DMIC"}, /* CODEC BE connections */ - {"HiFi Playback", NULL, "ssp5 Tx"}, - {"ssp5 Tx", NULL, "codec0_out"}, - - {"Playback", NULL, "ssp1 Tx"}, - {"ssp1 Tx", NULL, "codec1_out"}, - - {"codec0_in", NULL, "ssp1 Rx"}, - {"ssp1 Rx", NULL, "Capture"}, - {"HDMI1", NULL, "hif5-0 Output"}, {"HDMI2", NULL, "hif6-0 Output"}, {"HDMI2", NULL, "hif7-0 Output"}, @@ -146,6 +139,28 @@ static const struct snd_soc_dapm_route broxton_map[] = { { "Headset Mic", NULL, "Platform Clock" }, }; +static const struct snd_soc_dapm_route broxton_map[] = { + {"HiFi Playback", NULL, "ssp5 Tx"}, + {"ssp5 Tx", NULL, "codec0_out"}, + + {"Playback", NULL, "ssp1 Tx"}, + {"ssp1 Tx", NULL, "codec1_out"}, + + {"codec0_in", NULL, "ssp1 Rx"}, + {"ssp1 Rx", NULL, "Capture"}, +}; + +static const struct snd_soc_dapm_route gemini_map[] = { + {"HiFi Playback", NULL, "ssp1 Tx"}, + {"ssp1 Tx", NULL, "codec0_out"}, + + {"Playback", NULL, "ssp2 Tx"}, + {"ssp2 Tx", NULL, "codec1_out"}, + + {"codec0_in", NULL, "ssp2 Rx"}, + {"ssp2 Rx", NULL, "Capture"}, +}; + static int broxton_ssp_fixup(struct snd_soc_pcm_runtime *rtd, struct snd_pcm_hw_params *params) { @@ -524,6 +539,18 @@ static struct snd_soc_dai_link broxton_dais[] = { }, }; +static int is_geminilake(void) +{ + static const struct x86_cpu_id cpu_ids[] = { + { X86_VENDOR_INTEL, 6, 0x7A }, /* Geminilake CPU_ID */ + {} + }; + + if (x86_match_cpu(cpu_ids)) + return true; + return false; +} + #define NAME_SIZE 32 static int bxt_card_late_probe(struct snd_soc_card *card) { @@ -533,6 +560,13 @@ static int bxt_card_late_probe(struct snd_soc_card *card) int err, i = 0; char jack_name[NAME_SIZE]; + if (is_geminilake()) + snd_soc_dapm_add_routes(&card->dapm, gemini_map, + ARRAY_SIZE(gemini_map)); + else + snd_soc_dapm_add_routes(&card->dapm, broxton_map, + ARRAY_SIZE(broxton_map)); + list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) { component = pcm->codec_dai->component; snprintf(jack_name, sizeof(jack_name), @@ -559,7 +593,7 @@ static int bxt_card_late_probe(struct snd_soc_card *card) } /* broxton audio machine driver for SPT + da7219 */ -static struct snd_soc_card broxton_audio_card = { +static struct snd_soc_card bxt_audio_card_da7219_m98357a = { .name = "bxtda7219max", .owner = THIS_MODULE, .dai_link = broxton_dais, @@ -568,15 +602,35 @@ static struct snd_soc_card broxton_audio_card = { .num_controls = ARRAY_SIZE(broxton_controls), .dapm_widgets = broxton_widgets, .num_dapm_widgets = ARRAY_SIZE(broxton_widgets), - .dapm_routes = broxton_map, - .num_dapm_routes = ARRAY_SIZE(broxton_map), + .dapm_routes = audio_map, + .num_dapm_routes = ARRAY_SIZE(audio_map), .fully_routed = true, .late_probe = bxt_card_late_probe, }; +/* geminilake audio machine driver for SPT + DA7219 */ +static struct snd_soc_card glk_audio_card_da7219_m98357a = { + .name = "glkda7219max", + .owner = THIS_MODULE, + .dai_link = broxton_dais, + .num_links = ARRAY_SIZE(broxton_dais), + .controls = broxton_controls, + .num_controls = ARRAY_SIZE(broxton_controls), + .dapm_widgets = broxton_widgets, + .num_dapm_widgets = ARRAY_SIZE(broxton_widgets), + .dapm_routes = audio_map, + .num_dapm_routes = ARRAY_SIZE(audio_map), + .fully_routed = true, + .late_probe = bxt_card_late_probe, +}; + +static char glk_spk_dai_name[10]; +static char glk_hs_dai_name[10]; + static int broxton_audio_probe(struct platform_device *pdev) { struct bxt_card_private *ctx; + int dai_index = 8; ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_ATOMIC); if (!ctx) @@ -584,18 +638,54 @@ static int broxton_audio_probe(struct platform_device *pdev) INIT_LIST_HEAD(&ctx->hdmi_pcm_list); - broxton_audio_card.dev = &pdev->dev; - snd_soc_card_set_drvdata(&broxton_audio_card, ctx); + audio_card = + (struct snd_soc_card *)pdev->id_entry->driver_data; + + audio_card->dev = &pdev->dev; + snd_soc_card_set_drvdata(audio_card, ctx); + + if (is_geminilake()) { + /* fixup name & cpu_dai_name for SPK */ + snprintf(glk_spk_dai_name, + sizeof(glk_spk_dai_name), "%s", "SSP1-Codec"); + broxton_dais[dai_index].name = glk_spk_dai_name; + snprintf(glk_spk_dai_name, + sizeof(glk_spk_dai_name), "%s", "SSP1 Pin"); + broxton_dais[dai_index].cpu_dai_name = glk_spk_dai_name; + /* fixup name & cpu_dai_name for HS*/ + dai_index++; + snprintf(glk_hs_dai_name, + sizeof(glk_hs_dai_name), "%s", "SSP2-Codec"); + broxton_dais[dai_index].name = glk_hs_dai_name; + snprintf(glk_hs_dai_name, + sizeof(glk_hs_dai_name), "%s", "SSP2 Pin"); + broxton_dais[dai_index].cpu_dai_name = glk_hs_dai_name; + } - return devm_snd_soc_register_card(&pdev->dev, &broxton_audio_card); + return devm_snd_soc_register_card(&pdev->dev, audio_card); } +static const struct platform_device_id bxt_board_ids[] = { + { + .name = "bxt_da7219_max98357a", + .driver_data = + (kernel_ulong_t)&bxt_audio_card_da7219_m98357a, + }, + { + .name = "glk_da7219_max98357a", + .driver_data = + (kernel_ulong_t)&glk_audio_card_da7219_m98357a, + }, + { } +}; + static struct platform_driver broxton_audio = { .probe = broxton_audio_probe, .driver = { .name = "bxt_da7219_max98357a", .pm = &snd_soc_pm_ops, }, + .id_table = bxt_board_ids, }; module_platform_driver(broxton_audio) @@ -605,5 +695,7 @@ MODULE_AUTHOR("Sathyanarayana Nujella "); MODULE_AUTHOR("Rohit Ainapure "); MODULE_AUTHOR("Harsha Priya "); MODULE_AUTHOR("Conrad Cooke "); +MODULE_AUTHOR("Naveen Manohar "); MODULE_LICENSE("GPL v2"); MODULE_ALIAS("platform:bxt_da7219_max98357a"); +MODULE_ALIAS("platform:glk_da7219_max98357a");