Received: by 2002:ad5:4acb:0:0:0:0:0 with SMTP id n11csp359648imw; Fri, 8 Jul 2022 04:26:59 -0700 (PDT) X-Google-Smtp-Source: AGRyM1ufJfX18j3a0bGOCGt4PkFMRCIiSY5UNlaxUDmRrxEOfEGT5z7vsr2Uggzx7qyWA9n+UBBC X-Received: by 2002:a17:906:a3ca:b0:726:2bd2:87bc with SMTP id ca10-20020a170906a3ca00b007262bd287bcmr3074263ejb.226.1657279619180; Fri, 08 Jul 2022 04:26:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1657279619; cv=none; d=google.com; s=arc-20160816; b=A+lYtyq0LHP/6oz8l6F3FHPlggG4EPtn2TXxX7lhm7dzxuoMeN/N6FMxhscfPpDT45 Xo/twU+7QitvLpyPoga8G+zpByMmSdR/7uG4Gs0VDrwxbFJyF8G/kiHKnK/KbppJZdD9 RywoUAOv0lknPzLETzIGyMAyUCbITGtpCl+3+kMlHJAuE9mxRT+3FjqEjk+M2AtphWAE wyunI52pKenUk2FZngzfYyT85UCOKhTTN0OUqSXPh7dOIQQ7TY9VjDFRa2z4TNrnj6eZ etwHbnOLkWEsE15wgZsXYuSIqfEVSeIE5VbFA312I4i3PPvyweGKErbUEREX4JI0vxz7 IX1w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=yPC8wU0Xi32cq0YWmkRwYawX3iGKCUc2wrD/W46s2Kk=; b=vTTC++69bYnkaM/ez3+H/1PJ4oi25XhO21jNbxN0KbwA1EFHMN8HqEDONLASF9GyWI 55xYhPOu2FogkH82bIE69bzdHcyNI8yWu2KStoS4r84rH1VB636q3oSblzFN6ZYI9b1M +w7Q/lNmPOoC2fNKQJe7OJgWLbj2N5B4MXandSszeTmsCB/uEL2Q7tnDu77AA3mcde2H Q/CA4/MnM9vaRzsOqc9aL/qTNrRMVXhNpP9T4lkOldgNMuv7vDPjSI2wVGlBsWxGG3D3 Ad+9ErI2Vy0/2XOkHqydZTGK+0peffB4G/ZSl+GIT6kBCFxf3ZhyhsU8Whsi7EXAAFFQ Iu5A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=lY8lIbz9; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id dn5-20020a05640222e500b0043aa841258bsi2316418edb.574.2022.07.08.04.26.31; Fri, 08 Jul 2022 04:26:59 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=lY8lIbz9; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237947AbiGHLAu (ORCPT + 99 others); Fri, 8 Jul 2022 07:00:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34386 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237985AbiGHLAr (ORCPT ); Fri, 8 Jul 2022 07:00:47 -0400 Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9894A88F07 for ; Fri, 8 Jul 2022 04:00:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1657278044; x=1688814044; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=/wjtNKClKiwgx+CFJjG7HC5vs4Liykwkw/ovK1d+1uY=; b=lY8lIbz95bg5RVmaaHzgx1UCRqm2f5+Jhd8Qie6VcynWODCyppp5mw70 qm2l50ZsC143jJ8NErlw731lj3I13k+flOgnULbpZy1swfR/CbA5npsB+ 6Oa///y7wZ23E9HVsNYjoghtMWKcvL09ALy22hm1DAPYqbGvsyByt+/Mf EG7q8B5T15nSz5M/7HfgzIT5+yYsw6t4uZlbutVttkTGnAD3qOcT8ZAPw 1IYsb9i6P+XS80ImeLVHuI/Z2KhjfOsHAnb1dgC5VU9rh6oqYscmfqhWo FWsQ8wzDlNbMgONfYnyz8yalzMl0B1LXd+i3f8vBcvqDSzT8j1/3LfsGc g==; X-IronPort-AV: E=McAfee;i="6400,9594,10401"; a="267286456" X-IronPort-AV: E=Sophos;i="5.92,255,1650956400"; d="scan'208";a="267286456" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Jul 2022 04:00:44 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.92,255,1650956400"; d="scan'208";a="651524670" Received: from brentlu-brix.itwn.intel.com ([10.5.253.25]) by fmsmga008.fm.intel.com with ESMTP; 08 Jul 2022 04:00:40 -0700 From: Brent Lu To: alsa-devel@alsa-project.org Cc: Cezary Rojewski , Pierre-Louis Bossart , Liam Girdwood , Peter Ujfalusi , Bard Liao , Ranjani Sridharan , Kai Vehmanen , Mark Brown , Jaroslav Kysela , Takashi Iwai , Brent Lu , Akihiko Odaki , linux-kernel@vger.kernel.org, Rander Wang , Gongjun Song , Mac Chiang , Ajye Huang , Libin Yang , Muralidhar Reddy , David Lin Subject: [PATCH v8 1/2] ASoC: Intel: sof_cs42l42: support BT offload audio Date: Fri, 8 Jul 2022 19:00:29 +0800 Message-Id: <20220708110030.658468-2-brent.lu@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220708110030.658468-1-brent.lu@intel.com> References: <20220708110030.658468-1-brent.lu@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE, SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add the capability to machine driver of creating DAI Link for BT offload. Although BT offload always uses SSP2 port but we reserve the flexibility to assign the port number in macro. Signed-off-by: Brent Lu --- sound/soc/intel/boards/sof_cs42l42.c | 75 ++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/sound/soc/intel/boards/sof_cs42l42.c b/sound/soc/intel/boards/sof_cs42l42.c index a1a14d6d7c23..3d53bb420c66 100644 --- a/sound/soc/intel/boards/sof_cs42l42.c +++ b/sound/soc/intel/boards/sof_cs42l42.c @@ -41,8 +41,13 @@ #define SOF_CS42L42_DAILINK_MASK (GENMASK(24, 10)) #define SOF_CS42L42_DAILINK(link1, link2, link3, link4, link5) \ ((((link1) | ((link2) << 3) | ((link3) << 6) | ((link4) << 9) | ((link5) << 12)) << SOF_CS42L42_DAILINK_SHIFT) & SOF_CS42L42_DAILINK_MASK) -#define SOF_MAX98357A_SPEAKER_AMP_PRESENT BIT(25) -#define SOF_MAX98360A_SPEAKER_AMP_PRESENT BIT(26) +#define SOF_BT_OFFLOAD_PRESENT BIT(25) +#define SOF_CS42L42_SSP_BT_SHIFT 26 +#define SOF_CS42L42_SSP_BT_MASK (GENMASK(28, 26)) +#define SOF_CS42L42_SSP_BT(quirk) \ + (((quirk) << SOF_CS42L42_SSP_BT_SHIFT) & SOF_CS42L42_SSP_BT_MASK) +#define SOF_MAX98357A_SPEAKER_AMP_PRESENT BIT(29) +#define SOF_MAX98360A_SPEAKER_AMP_PRESENT BIT(30) enum { LINK_NONE = 0, @@ -50,6 +55,7 @@ enum { LINK_SPK = 2, LINK_DMIC = 3, LINK_HDMI = 4, + LINK_BT = 5, }; static struct snd_soc_jack_pin jack_pins[] = { @@ -290,6 +296,13 @@ static struct snd_soc_dai_link_component dmic_component[] = { } }; +static struct snd_soc_dai_link_component dummy_component[] = { + { + .name = "snd-soc-dummy", + .dai_name = "snd-soc-dummy-dai", + } +}; + static int create_spk_amp_dai_links(struct device *dev, struct snd_soc_dai_link *links, struct snd_soc_dai_link_component *cpus, @@ -479,9 +492,50 @@ static int create_hdmi_dai_links(struct device *dev, return -ENOMEM; } +static int create_bt_offload_dai_links(struct device *dev, + struct snd_soc_dai_link *links, + struct snd_soc_dai_link_component *cpus, + int *id, int ssp_bt) +{ + /* bt offload */ + if (!(sof_cs42l42_quirk & SOF_BT_OFFLOAD_PRESENT)) + return 0; + + links[*id].name = devm_kasprintf(dev, GFP_KERNEL, "SSP%d-BT", + ssp_bt); + if (!links[*id].name) + goto devm_err; + + links[*id].id = *id; + links[*id].codecs = dummy_component; + links[*id].num_codecs = ARRAY_SIZE(dummy_component); + links[*id].platforms = platform_component; + links[*id].num_platforms = ARRAY_SIZE(platform_component); + + links[*id].dpcm_playback = 1; + links[*id].dpcm_capture = 1; + links[*id].no_pcm = 1; + links[*id].cpus = &cpus[*id]; + links[*id].num_cpus = 1; + + links[*id].cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL, + "SSP%d Pin", + ssp_bt); + if (!links[*id].cpus->dai_name) + goto devm_err; + + (*id)++; + + return 0; + +devm_err: + return -ENOMEM; +} + static struct snd_soc_dai_link *sof_card_dai_links_create(struct device *dev, int ssp_codec, int ssp_amp, + int ssp_bt, int dmic_be_num, int hdmi_num) { @@ -534,6 +588,14 @@ static struct snd_soc_dai_link *sof_card_dai_links_create(struct device *dev, goto devm_err; } break; + case LINK_BT: + ret = create_bt_offload_dai_links(dev, links, cpus, &id, ssp_bt); + if (ret < 0) { + dev_err(dev, "fail to create bt offload dai links, ret %d\n", + ret); + goto devm_err; + } + break; case LINK_NONE: /* caught here if it's not used as terminator in macro */ default: @@ -555,7 +617,7 @@ static int sof_audio_probe(struct platform_device *pdev) struct snd_soc_acpi_mach *mach; struct sof_card_private *ctx; int dmic_be_num, hdmi_num; - int ret, ssp_amp, ssp_codec; + int ret, ssp_bt, ssp_amp, ssp_codec; ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); if (!ctx) @@ -580,6 +642,9 @@ static int sof_audio_probe(struct platform_device *pdev) dev_dbg(&pdev->dev, "sof_cs42l42_quirk = %lx\n", sof_cs42l42_quirk); + ssp_bt = (sof_cs42l42_quirk & SOF_CS42L42_SSP_BT_MASK) >> + SOF_CS42L42_SSP_BT_SHIFT; + ssp_amp = (sof_cs42l42_quirk & SOF_CS42L42_SSP_AMP_MASK) >> SOF_CS42L42_SSP_AMP_SHIFT; @@ -590,9 +655,11 @@ static int sof_audio_probe(struct platform_device *pdev) if (sof_cs42l42_quirk & SOF_SPEAKER_AMP_PRESENT) sof_audio_card_cs42l42.num_links++; + if (sof_cs42l42_quirk & SOF_BT_OFFLOAD_PRESENT) + sof_audio_card_cs42l42.num_links++; dai_links = sof_card_dai_links_create(&pdev->dev, ssp_codec, ssp_amp, - dmic_be_num, hdmi_num); + ssp_bt, dmic_be_num, hdmi_num); if (!dai_links) return -ENOMEM; -- 2.25.1