From patchwork Thu Mar 5 13:06:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pierre-Louis Bossart X-Patchwork-Id: 193403 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 300CBC3F2D1 for ; Thu, 5 Mar 2020 13:08:31 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id AA4A92073B for ; Thu, 5 Mar 2020 13:08:30 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=alsa-project.org header.i=@alsa-project.org header.b="fp0J0m49" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AA4A92073B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 1FB021607; Thu, 5 Mar 2020 14:07:36 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 1FB021607 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1583413706; bh=QtadTGNeD3JYpv4iBdDHvMrBhrRjKlUcRH+KvkHxONw=; h=From:To:Subject:Date:In-Reply-To:References:Cc:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=fp0J0m49Rc2n6uopHVUdSDXoasptJsgsNXzYrlx7gn0gOBkS5ltjo+C8Oeelu76DC eIJ5X3LR6n9aXBCGcFjo/EWFKhuH96GCa32S+Mx47Gw5++4mMIMW1HOX91ysDRqGAZ njpMkyrxj5F7f6lwaE2STAzOqiJRtYMy6Ya8JYjg= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id D89CDF80266; Thu, 5 Mar 2020 14:06:43 +0100 (CET) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 32C1CF80245; Thu, 5 Mar 2020 14:06:36 +0100 (CET) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id BBC82F80245 for ; Thu, 5 Mar 2020 14:06:32 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz BBC82F80245 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Mar 2020 05:06:28 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,518,1574150400"; d="scan'208";a="287659380" Received: from virbhadx-mobl1.amr.corp.intel.com (HELO pbossart-mobl3.amr.corp.intel.com) ([10.254.184.168]) by FMSMGA003.fm.intel.com with ESMTP; 05 Mar 2020 05:06:27 -0800 From: Pierre-Louis Bossart To: alsa-devel@alsa-project.org Subject: [RFC PATCH 1/3] ASoC: soc-core: introduce exit() callback for dailinks Date: Thu, 5 Mar 2020 07:06:14 -0600 Message-Id: <20200305130616.28658-2-pierre-louis.bossart@linux.intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200305130616.28658-1-pierre-louis.bossart@linux.intel.com> References: <20200305130616.28658-1-pierre-louis.bossart@linux.intel.com> MIME-Version: 1.0 Cc: tiwai@suse.de, Andy Shevchenko , broonie@kernel.org, Pierre-Louis Bossart , Kuninori Morimoto X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 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: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" Some machine drivers allocate or request resources during the init() phase, which need to be released at some point, e.g. when rebooting or unloading modules. In an initial pass, we added a .remove() callback for the platform driver, but that's not symmetrical at all and would be difficult to handle if there are more than one dailink implementing an .init(). We looked also into using .remove_dai_link() callback, but that would also be imlanced. The suggested solution is to use a dual exit() phase for dailinks to release all resources. The exit() is invoked in soc_free_pcm_runtime(), which is not completely symmetric with the init() invoked in soc_init_pcm_runtime() - not soc_add_pcm_runtime(), but that's the best solution so far. Suggested-by: Andy Shevchenko Signed-off-by: Pierre-Louis Bossart --- include/sound/soc.h | 3 +++ sound/soc/soc-core.c | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/sound/soc.h b/include/sound/soc.h index 81e5d17be935..2beebe89ebbc 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -794,6 +794,9 @@ struct snd_soc_dai_link { /* codec/machine specific init - e.g. add machine controls */ int (*init)(struct snd_soc_pcm_runtime *rtd); + /* codec/machine specific exit - dual of init() */ + void (*exit)(struct snd_soc_pcm_runtime *rtd); + /* optional hw_params re-writing for BE and FE sync */ int (*be_hw_params_fixup)(struct snd_soc_pcm_runtime *rtd, struct snd_pcm_hw_params *params); diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index f2cfbf182f49..09a0976d6a62 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -937,8 +937,14 @@ static int soc_dai_link_sanity_check(struct snd_soc_card *card, void snd_soc_remove_pcm_runtime(struct snd_soc_card *card, struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_dai_link *dai_link = rtd->dai_link; + lockdep_assert_held(&client_mutex); + /* release machine specific resources */ + if (dai_link->exit) + dai_link->exit(rtd); + /* * Notify the machine driver for extra destruction */ @@ -1069,7 +1075,7 @@ static int soc_init_pcm_runtime(struct snd_soc_card *card, /* set default power off timeout */ rtd->pmdown_time = pmdown_time; - /* do machine specific initialization */ + /* do machine specific allocations and initialization */ if (dai_link->init) { ret = dai_link->init(rtd); if (ret < 0) {