From patchwork Thu Oct 27 07:15:20 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: mengdong.lin@linux.intel.com X-Patchwork-Id: 9399629 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 351836059C for ; Thu, 27 Oct 2016 14:46:30 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1C8321FFC9 for ; Thu, 27 Oct 2016 14:46:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0E3A32A2FA; Thu, 27 Oct 2016 14:46:30 +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=-1.9 required=2.0 tests=BAYES_00, 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 1285C2A0D7 for ; Thu, 27 Oct 2016 14:46:24 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id 2BF1B267417; Thu, 27 Oct 2016 16:46:23 +0200 (CEST) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id B6A1A267416; Thu, 27 Oct 2016 16:43:55 +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 1CF86267327; Thu, 27 Oct 2016 09:14:12 +0200 (CEST) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by alsa0.perex.cz (Postfix) with ESMTP id 30ABE2672C7 for ; Thu, 27 Oct 2016 09:14:05 +0200 (CEST) Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga104.jf.intel.com with ESMTP; 27 Oct 2016 00:14:04 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,404,1473145200"; d="scan'208";a="24197504" Received: from amanda-haswell-pc.sh.intel.com ([10.239.159.21]) by fmsmga006.fm.intel.com with ESMTP; 27 Oct 2016 00:14:02 -0700 From: mengdong.lin@linux.intel.com To: alsa-devel@alsa-project.org Date: Thu, 27 Oct 2016 15:15:20 +0800 Message-Id: <03fcedf1c5941cde4d6a6e0184f06727330d56b6.1477549962.git.mengdong.lin@linux.intel.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: References: Cc: Mengdong Lin , tiwai@suse.de, hardik.t.shah@intel.com, guneshwor.o.singh@intel.com, liam.r.girdwood@linux.intel.com, vinod.koul@intel.com, broonie@kernel.org, mengdong.lin@intel.com Subject: [alsa-devel] [PATCH 22/22] topology: Export physical DAIs to the binary for kernel 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 From: Guneshwor Singh Export the physical DAI objects to the binary output file for kernel. For physical DAIs defined by the text conf file, find and merge their stream capablities and private data before exporting. Signed-off-by: Guneshwor Singh Signed-off-by: Mengdong Lin diff --git a/src/topology/builder.c b/src/topology/builder.c index b0ba54e..20fa925 100644 --- a/src/topology/builder.c +++ b/src/topology/builder.c @@ -204,6 +204,9 @@ static int write_block(snd_tplg_t *tplg, struct list_head *base, case SND_TPLG_TYPE_DATA: return write_elem_block(tplg, base, size, SND_SOC_TPLG_TYPE_PDATA, "data"); + case SND_TPLG_TYPE_DAI: + return write_elem_block(tplg, base, size, + SND_SOC_TPLG_TYPE_DAI, "dai"); default: return -EINVAL; } @@ -293,6 +296,14 @@ int tplg_write_data(snd_tplg_t *tplg) return ret; } + /* write physical dai elems */ + ret = write_block(tplg, &tplg->dai_list, + SND_TPLG_TYPE_DAI); + if (ret < 0) { + SNDERR("failed to write physical dai elems %d\n", ret); + return ret; + } + /* write be elems */ ret = write_block(tplg, &tplg->be_list, SND_TPLG_TYPE_BE); diff --git a/src/topology/parser.c b/src/topology/parser.c index 4afa576..c5f9757 100644 --- a/src/topology/parser.c +++ b/src/topology/parser.c @@ -288,6 +288,10 @@ static int tplg_build_integ(snd_tplg_t *tplg) if (err < 0) return err; + err = tplg_build_dais(tplg, SND_TPLG_TYPE_DAI); + if (err < 0) + return err; + err = tplg_build_links(tplg, SND_TPLG_TYPE_BE); if (err < 0) return err; diff --git a/src/topology/pcm.c b/src/topology/pcm.c index e1d266a..c41831c 100644 --- a/src/topology/pcm.c +++ b/src/topology/pcm.c @@ -129,6 +129,61 @@ int tplg_build_pcms(snd_tplg_t *tplg, unsigned int type) return 0; } +/* build a physical DAI */ +static int tplg_build_dai(snd_tplg_t *tplg, struct tplg_elem *elem) +{ + struct tplg_ref *ref; + struct list_head *base, *pos; + int err = 0; + + /* get playback & capture stream caps */ + err = tplg_build_stream_caps(tplg, elem->id, elem->dai->caps); + if (err < 0) + return err; + + /* get private data */ + base = &elem->ref_list; + list_for_each(pos, base) { + + ref = list_entry(pos, struct tplg_ref, list); + + if (ref->type == SND_TPLG_TYPE_DATA) { + err = tplg_copy_data(tplg, elem, ref); + if (err < 0) + return err; + } + } + + /* add DAI to manifest */ + tplg->manifest.dai_elems++; + + return 0; +} + +/* build physical DAIs*/ +int tplg_build_dais(snd_tplg_t *tplg, unsigned int type) +{ + struct list_head *base, *pos; + struct tplg_elem *elem; + int err = 0; + + base = &tplg->dai_list; + list_for_each(pos, base) { + + elem = list_entry(pos, struct tplg_elem, list); + if (elem->type != type) { + SNDERR("error: invalid elem '%s'\n", elem->id); + return -EINVAL; + } + + err = tplg_build_dai(tplg, elem); + if (err < 0) + return err; + } + + return 0; +} + static int tplg_build_stream_cfg(snd_tplg_t *tplg, struct snd_soc_tplg_stream *stream, int num_streams) { diff --git a/src/topology/tplg_local.h b/src/topology/tplg_local.h index 807462b..f913563 100644 --- a/src/topology/tplg_local.h +++ b/src/topology/tplg_local.h @@ -294,6 +294,7 @@ int tplg_add_bytes(snd_tplg_t *tplg, struct snd_tplg_bytes_template *bytes_ctl, struct tplg_elem **e); int tplg_build_pcms(snd_tplg_t *tplg, unsigned int type); +int tplg_build_dais(snd_tplg_t *tplg, unsigned int type); int tplg_build_links(snd_tplg_t *tplg, unsigned int type); int tplg_add_link_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t); int tplg_add_pcm_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t);