From nobody Thu Apr 9 00:19:19 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CC8ACFA3741 for ; Tue, 1 Nov 2022 02:30:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229911AbiKACak (ORCPT ); Mon, 31 Oct 2022 22:30:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35730 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229783AbiKACai (ORCPT ); Mon, 31 Oct 2022 22:30:38 -0400 Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0CA44D13E for ; Mon, 31 Oct 2022 19:30:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1667269837; x=1698805837; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Nha+cAjfFYdN1e072igYPcVQvV7I74uH4Vu/8Q6fFzs=; b=cVbR38duo71+LGFeYXHSir8+aGau4gJ/8nGrlgtYUujdNswgsEDB0ilE WcDyBhVFNJ+Wu/wPqHpPK5IRzLyTXH9r0VezuryXf9+cmP+3P5cBczvW2 lsWB8HVRVtY2f71kp+hOxHk6t6foHnMfhv8MjYKLOFO1SRNeZyV/0UhTy fnNJG9AqOhW6qp7nVZxrUvY1gw51ufpaOFL0jqTlp3RfzWxifEYoy1JgP a5AkxRqfWLUS3dphgnjfI1WEE3APw3rm7qONjHESFbHa/LlBAyIxZvEmO tMmzmD1SgD03Hpxiz6SPM1lIUSMlrahHj/nrX/yaB8OTt4xumzwEgNf3V g==; X-IronPort-AV: E=McAfee;i="6500,9779,10517"; a="288763723" X-IronPort-AV: E=Sophos;i="5.95,229,1661842800"; d="scan'208";a="288763723" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Oct 2022 19:30:36 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10517"; a="611709369" X-IronPort-AV: E=Sophos;i="5.95,229,1661842800"; d="scan'208";a="611709369" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Oct 2022 19:30:34 -0700 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, bard.liao@intel.com Subject: [PATCH 1/2] soundwire: cadence: rename sdw_cdns_dai_dma_data as sdw_cdns_dai_runtime Date: Tue, 1 Nov 2022 10:35:20 +0800 Message-Id: <20221101023521.2384586-2-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221101023521.2384586-1-yung-chuan.liao@linux.intel.com> References: <20221101023521.2384586-1-yung-chuan.liao@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Pierre-Louis Bossart The existing 'struct sdw_cdns_dma_data' has really nothing to do with DMAs. The information is stored in the dai->dma_data, but this is really private data that should be stored in a different context. Beyond the academic elegance discussion, using dma_data is a problem for new Intel hardware where the dma_data structure is already used for true DMA handling performed by other parts of the code. This patch prepares a transition away from the use of dma_data, for now with a rename-only change. Signed-off-by: Pierre-Louis Bossart Reviewed-by: P=C3=A9ter Ujfalusi Signed-off-by: Bard Liao --- drivers/soundwire/cadence_master.c | 30 +++++----- drivers/soundwire/cadence_master.h | 4 +- drivers/soundwire/intel.c | 96 +++++++++++++++--------------- 3 files changed, 65 insertions(+), 65 deletions(-) diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence= _master.c index 93929f19d083..235617b0542f 100644 --- a/drivers/soundwire/cadence_master.c +++ b/drivers/soundwire/cadence_master.c @@ -1707,40 +1707,40 @@ int cdns_set_sdw_stream(struct snd_soc_dai *dai, void *stream, int direction) { struct sdw_cdns *cdns =3D snd_soc_dai_get_drvdata(dai); - struct sdw_cdns_dma_data *dma; + struct sdw_cdns_dai_runtime *dai_runtime; =20 if (stream) { /* first paranoia check */ if (direction =3D=3D SNDRV_PCM_STREAM_PLAYBACK) - dma =3D dai->playback_dma_data; + dai_runtime =3D dai->playback_dma_data; else - dma =3D dai->capture_dma_data; + dai_runtime =3D dai->capture_dma_data; =20 - if (dma) { + if (dai_runtime) { dev_err(dai->dev, - "dma_data already allocated for dai %s\n", + "dai_runtime already allocated for dai %s\n", dai->name); return -EINVAL; } =20 - /* allocate and set dma info */ - dma =3D kzalloc(sizeof(*dma), GFP_KERNEL); - if (!dma) + /* allocate and set dai_runtime info */ + dai_runtime =3D kzalloc(sizeof(*dai_runtime), GFP_KERNEL); + if (!dai_runtime) return -ENOMEM; =20 - dma->stream_type =3D SDW_STREAM_PCM; + dai_runtime->stream_type =3D SDW_STREAM_PCM; =20 - dma->bus =3D &cdns->bus; - dma->link_id =3D cdns->instance; + dai_runtime->bus =3D &cdns->bus; + dai_runtime->link_id =3D cdns->instance; =20 - dma->stream =3D stream; + dai_runtime->stream =3D stream; =20 if (direction =3D=3D SNDRV_PCM_STREAM_PLAYBACK) - dai->playback_dma_data =3D dma; + dai->playback_dma_data =3D dai_runtime; else - dai->capture_dma_data =3D dma; + dai->capture_dma_data =3D dai_runtime; } else { - /* for NULL stream we release allocated dma_data */ + /* for NULL stream we release allocated dai_runtime */ if (direction =3D=3D SNDRV_PCM_STREAM_PLAYBACK) { kfree(dai->playback_dma_data); dai->playback_dma_data =3D NULL; diff --git a/drivers/soundwire/cadence_master.h b/drivers/soundwire/cadence= _master.h index ca9e805bab88..93f23bd46e2c 100644 --- a/drivers/soundwire/cadence_master.h +++ b/drivers/soundwire/cadence_master.h @@ -70,7 +70,7 @@ struct sdw_cdns_stream_config { }; =20 /** - * struct sdw_cdns_dma_data: Cadence DMA data + * struct sdw_cdns_dai_runtime: Cadence DAI runtime data * * @name: SoundWire stream name * @stream: stream runtime @@ -82,7 +82,7 @@ struct sdw_cdns_stream_config { * @suspended: status set when suspended, to be used in .prepare * @paused: status set in .trigger, to be used in suspend */ -struct sdw_cdns_dma_data { +struct sdw_cdns_dai_runtime { char *name; struct sdw_stream_runtime *stream; struct sdw_cdns_pdi *pdi; diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c index 244209358784..1e9c6df4b62c 100644 --- a/drivers/soundwire/intel.c +++ b/drivers/soundwire/intel.c @@ -824,15 +824,15 @@ static int intel_hw_params(struct snd_pcm_substream *= substream, { struct sdw_cdns *cdns =3D snd_soc_dai_get_drvdata(dai); struct sdw_intel *sdw =3D cdns_to_intel(cdns); - struct sdw_cdns_dma_data *dma; + struct sdw_cdns_dai_runtime *dai_runtime; struct sdw_cdns_pdi *pdi; struct sdw_stream_config sconfig; struct sdw_port_config *pconfig; int ch, dir; int ret; =20 - dma =3D snd_soc_dai_get_dma_data(dai, substream); - if (!dma) + dai_runtime =3D snd_soc_dai_get_dma_data(dai, substream); + if (!dai_runtime) return -EIO; =20 ch =3D params_channels(params); @@ -854,10 +854,10 @@ static int intel_hw_params(struct snd_pcm_substream *= substream, sdw_cdns_config_stream(cdns, ch, dir, pdi); =20 /* store pdi and hw_params, may be needed in prepare step */ - dma->paused =3D false; - dma->suspended =3D false; - dma->pdi =3D pdi; - dma->hw_params =3D params; + dai_runtime->paused =3D false; + dai_runtime->suspended =3D false; + dai_runtime->pdi =3D pdi; + dai_runtime->hw_params =3D params; =20 /* Inform DSP about PDI stream number */ ret =3D intel_params_stream(sdw, substream->stream, dai, params, @@ -869,7 +869,7 @@ static int intel_hw_params(struct snd_pcm_substream *su= bstream, sconfig.direction =3D dir; sconfig.ch_count =3D ch; sconfig.frame_rate =3D params_rate(params); - sconfig.type =3D dma->stream_type; + sconfig.type =3D dai_runtime->stream_type; =20 sconfig.bps =3D snd_pcm_format_width(params_format(params)); =20 @@ -884,7 +884,7 @@ static int intel_hw_params(struct snd_pcm_substream *su= bstream, pconfig->ch_mask =3D (1 << ch) - 1; =20 ret =3D sdw_stream_add_master(&cdns->bus, &sconfig, - pconfig, 1, dma->stream); + pconfig, 1, dai_runtime->stream); if (ret) dev_err(cdns->dev, "add master to stream failed:%d\n", ret); =20 @@ -898,19 +898,19 @@ static int intel_prepare(struct snd_pcm_substream *su= bstream, { struct sdw_cdns *cdns =3D snd_soc_dai_get_drvdata(dai); struct sdw_intel *sdw =3D cdns_to_intel(cdns); - struct sdw_cdns_dma_data *dma; + struct sdw_cdns_dai_runtime *dai_runtime; int ch, dir; int ret =3D 0; =20 - dma =3D snd_soc_dai_get_dma_data(dai, substream); - if (!dma) { - dev_err(dai->dev, "failed to get dma data in %s\n", + dai_runtime =3D snd_soc_dai_get_dma_data(dai, substream); + if (!dai_runtime) { + dev_err(dai->dev, "failed to get dai runtime in %s\n", __func__); return -EIO; } =20 - if (dma->suspended) { - dma->suspended =3D false; + if (dai_runtime->suspended) { + dai_runtime->suspended =3D false; =20 /* * .prepare() is called after system resume, where we @@ -921,21 +921,21 @@ static int intel_prepare(struct snd_pcm_substream *su= bstream, */ =20 /* configure stream */ - ch =3D params_channels(dma->hw_params); + ch =3D params_channels(dai_runtime->hw_params); if (substream->stream =3D=3D SNDRV_PCM_STREAM_CAPTURE) dir =3D SDW_DATA_DIR_RX; else dir =3D SDW_DATA_DIR_TX; =20 - intel_pdi_shim_configure(sdw, dma->pdi); - intel_pdi_alh_configure(sdw, dma->pdi); - sdw_cdns_config_stream(cdns, ch, dir, dma->pdi); + intel_pdi_shim_configure(sdw, dai_runtime->pdi); + intel_pdi_alh_configure(sdw, dai_runtime->pdi); + sdw_cdns_config_stream(cdns, ch, dir, dai_runtime->pdi); =20 /* Inform DSP about PDI stream number */ ret =3D intel_params_stream(sdw, substream->stream, dai, - dma->hw_params, + dai_runtime->hw_params, sdw->instance, - dma->pdi->intel_alh_id); + dai_runtime->pdi->intel_alh_id); } =20 return ret; @@ -946,11 +946,11 @@ intel_hw_free(struct snd_pcm_substream *substream, st= ruct snd_soc_dai *dai) { struct sdw_cdns *cdns =3D snd_soc_dai_get_drvdata(dai); struct sdw_intel *sdw =3D cdns_to_intel(cdns); - struct sdw_cdns_dma_data *dma; + struct sdw_cdns_dai_runtime *dai_runtime; int ret; =20 - dma =3D snd_soc_dai_get_dma_data(dai, substream); - if (!dma) + dai_runtime =3D snd_soc_dai_get_dma_data(dai, substream); + if (!dai_runtime) return -EIO; =20 /* @@ -959,10 +959,10 @@ intel_hw_free(struct snd_pcm_substream *substream, st= ruct snd_soc_dai *dai) * DEPREPARED for the first cpu-dai and to RELEASED for the last * cpu-dai. */ - ret =3D sdw_stream_remove_master(&cdns->bus, dma->stream); + ret =3D sdw_stream_remove_master(&cdns->bus, dai_runtime->stream); if (ret < 0) { dev_err(dai->dev, "remove master from stream %s failed: %d\n", - dma->stream->name, ret); + dai_runtime->stream->name, ret); return ret; } =20 @@ -972,8 +972,8 @@ intel_hw_free(struct snd_pcm_substream *substream, stru= ct snd_soc_dai *dai) return ret; } =20 - dma->hw_params =3D NULL; - dma->pdi =3D NULL; + dai_runtime->hw_params =3D NULL; + dai_runtime->pdi =3D NULL; =20 return 0; } @@ -996,17 +996,17 @@ static int intel_pcm_set_sdw_stream(struct snd_soc_da= i *dai, static void *intel_get_sdw_stream(struct snd_soc_dai *dai, int direction) { - struct sdw_cdns_dma_data *dma; + struct sdw_cdns_dai_runtime *dai_runtime; =20 if (direction =3D=3D SNDRV_PCM_STREAM_PLAYBACK) - dma =3D dai->playback_dma_data; + dai_runtime =3D dai->playback_dma_data; else - dma =3D dai->capture_dma_data; + dai_runtime =3D dai->capture_dma_data; =20 - if (!dma) + if (!dai_runtime) return ERR_PTR(-EINVAL); =20 - return dma->stream; + return dai_runtime->stream; } =20 static int intel_trigger(struct snd_pcm_substream *substream, int cmd, str= uct snd_soc_dai *dai) @@ -1014,7 +1014,7 @@ static int intel_trigger(struct snd_pcm_substream *su= bstream, int cmd, struct sn struct sdw_cdns *cdns =3D snd_soc_dai_get_drvdata(dai); struct sdw_intel *sdw =3D cdns_to_intel(cdns); struct sdw_intel_link_res *res =3D sdw->link_res; - struct sdw_cdns_dma_data *dma; + struct sdw_cdns_dai_runtime *dai_runtime; int ret =3D 0; =20 /* @@ -1025,9 +1025,9 @@ static int intel_trigger(struct snd_pcm_substream *su= bstream, int cmd, struct sn if (res->ops && res->ops->trigger) res->ops->trigger(dai, cmd, substream->stream); =20 - dma =3D snd_soc_dai_get_dma_data(dai, substream); - if (!dma) { - dev_err(dai->dev, "failed to get dma data in %s\n", + dai_runtime =3D snd_soc_dai_get_dma_data(dai, substream); + if (!dai_runtime) { + dev_err(dai->dev, "failed to get dai runtime in %s\n", __func__); return -EIO; } @@ -1042,17 +1042,17 @@ static int intel_trigger(struct snd_pcm_substream *= substream, int cmd, struct sn * the .trigger callback is used to track the suspend case only. */ =20 - dma->suspended =3D true; + dai_runtime->suspended =3D true; =20 ret =3D intel_free_stream(sdw, substream->stream, dai, sdw->instance); break; =20 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - dma->paused =3D true; + dai_runtime->paused =3D true; break; case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - dma->paused =3D false; + dai_runtime->paused =3D false; break; default: break; @@ -1091,25 +1091,25 @@ static int intel_component_dais_suspend(struct snd_= soc_component *component) for_each_component_dais(component, dai) { struct sdw_cdns *cdns =3D snd_soc_dai_get_drvdata(dai); struct sdw_intel *sdw =3D cdns_to_intel(cdns); - struct sdw_cdns_dma_data *dma; + struct sdw_cdns_dai_runtime *dai_runtime; int stream; int ret; =20 - dma =3D dai->playback_dma_data; + dai_runtime =3D dai->playback_dma_data; stream =3D SNDRV_PCM_STREAM_PLAYBACK; - if (!dma) { - dma =3D dai->capture_dma_data; + if (!dai_runtime) { + dai_runtime =3D dai->capture_dma_data; stream =3D SNDRV_PCM_STREAM_CAPTURE; } =20 - if (!dma) + if (!dai_runtime) continue; =20 - if (dma->suspended) + if (dai_runtime->suspended) continue; =20 - if (dma->paused) { - dma->suspended =3D true; + if (dai_runtime->paused) { + dai_runtime->suspended =3D true; =20 ret =3D intel_free_stream(sdw, stream, dai, sdw->instance); if (ret < 0) --=20 2.25.1 From nobody Thu Apr 9 00:19:19 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B5AECFA3741 for ; Tue, 1 Nov 2022 02:30:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229934AbiKACap (ORCPT ); Mon, 31 Oct 2022 22:30:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35766 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229872AbiKACaj (ORCPT ); Mon, 31 Oct 2022 22:30:39 -0400 Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E4B4D1789C for ; Mon, 31 Oct 2022 19:30:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1667269838; x=1698805838; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=za/Z9PfLJMMXCFFtbbmJABNMg+7cNftbJHk93bK/Hts=; b=D4wFLvaUTbagrjCWGeIx5Y0dUrV4z1Nw8IIswcS7p8+Bbs92tOkXzzSD cTKlGaIhxKy4C5fzVdb2Sjf1FBERM+jixgQwj5aLf/l9FSVXXXVvRqjXK Z6bMfIzbMfwVlc+0w28dFoivxmi9R/N6EC5VB6oQ8JD6gjQxS09odJkAj mjSYhDKOdCPCFWDTIHLIvs8kcdRaZPB7cTnrRN/ZNxCzoA2VsGXTsRLKm c6mGPedGRzFfGHI606yzBkz7xrXCDwykR/z52lQ9/25AtiqydMvgyhiNs pf++EWuL9+PlblhRtfTdNA2tChsB6EY72UX0cj7scGfsdTwG3/ou2wlzl w==; X-IronPort-AV: E=McAfee;i="6500,9779,10517"; a="288763726" X-IronPort-AV: E=Sophos;i="5.95,229,1661842800"; d="scan'208";a="288763726" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Oct 2022 19:30:38 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10517"; a="611709385" X-IronPort-AV: E=Sophos;i="5.95,229,1661842800"; d="scan'208";a="611709385" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Oct 2022 19:30:36 -0700 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, bard.liao@intel.com Subject: [PATCH 2/2] soundwire: cadence: use dai_runtime_array instead of dma_data Date: Tue, 1 Nov 2022 10:35:21 +0800 Message-Id: <20221101023521.2384586-3-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221101023521.2384586-1-yung-chuan.liao@linux.intel.com> References: <20221101023521.2384586-1-yung-chuan.liao@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Pierre-Louis Bossart Simplify the code with a Cadence-specific dai_runtime_array, indexed with dai->id, instead of abusing dma_data. Signed-off-by: Pierre-Louis Bossart Reviewed-by: P=C3=A9ter Ujfalusi Signed-off-by: Bard Liao --- drivers/soundwire/cadence_master.c | 30 +++++++++++++-------------- drivers/soundwire/cadence_master.h | 5 +++++ drivers/soundwire/intel.c | 33 +++++++++++++++--------------- 3 files changed, 35 insertions(+), 33 deletions(-) diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence= _master.c index 235617b0542f..a1de363eba3f 100644 --- a/drivers/soundwire/cadence_master.c +++ b/drivers/soundwire/cadence_master.c @@ -1709,13 +1709,10 @@ int cdns_set_sdw_stream(struct snd_soc_dai *dai, struct sdw_cdns *cdns =3D snd_soc_dai_get_drvdata(dai); struct sdw_cdns_dai_runtime *dai_runtime; =20 + dai_runtime =3D cdns->dai_runtime_array[dai->id]; + if (stream) { /* first paranoia check */ - if (direction =3D=3D SNDRV_PCM_STREAM_PLAYBACK) - dai_runtime =3D dai->playback_dma_data; - else - dai_runtime =3D dai->capture_dma_data; - if (dai_runtime) { dev_err(dai->dev, "dai_runtime already allocated for dai %s\n", @@ -1734,20 +1731,21 @@ int cdns_set_sdw_stream(struct snd_soc_dai *dai, dai_runtime->link_id =3D cdns->instance; =20 dai_runtime->stream =3D stream; + dai_runtime->direction =3D direction; =20 - if (direction =3D=3D SNDRV_PCM_STREAM_PLAYBACK) - dai->playback_dma_data =3D dai_runtime; - else - dai->capture_dma_data =3D dai_runtime; + cdns->dai_runtime_array[dai->id] =3D dai_runtime; } else { + /* second paranoia check */ + if (!dai_runtime) { + dev_err(dai->dev, + "dai_runtime not allocated for dai %s\n", + dai->name); + return -EINVAL; + } + /* for NULL stream we release allocated dai_runtime */ - if (direction =3D=3D SNDRV_PCM_STREAM_PLAYBACK) { - kfree(dai->playback_dma_data); - dai->playback_dma_data =3D NULL; - } else { - kfree(dai->capture_dma_data); - dai->capture_dma_data =3D NULL; - } + kfree(dai_runtime); + cdns->dai_runtime_array[dai->id] =3D NULL; } return 0; } diff --git a/drivers/soundwire/cadence_master.h b/drivers/soundwire/cadence= _master.h index 93f23bd46e2c..0434d70d4b1f 100644 --- a/drivers/soundwire/cadence_master.h +++ b/drivers/soundwire/cadence_master.h @@ -81,6 +81,7 @@ struct sdw_cdns_stream_config { * @hw_params: hw_params to be applied in .prepare step * @suspended: status set when suspended, to be used in .prepare * @paused: status set in .trigger, to be used in suspend + * @direction: stream direction */ struct sdw_cdns_dai_runtime { char *name; @@ -92,6 +93,7 @@ struct sdw_cdns_dai_runtime { struct snd_pcm_hw_params *hw_params; bool suspended; bool paused; + int direction; }; =20 /** @@ -108,6 +110,7 @@ struct sdw_cdns_dai_runtime { * @registers: Cadence registers * @link_up: Link status * @msg_count: Messages sent on bus + * @dai_runtime_array: runtime context for each allocated DAI. */ struct sdw_cdns { struct device *dev; @@ -135,6 +138,8 @@ struct sdw_cdns { struct work_struct work; =20 struct list_head list; + + struct sdw_cdns_dai_runtime **dai_runtime_array; }; =20 #define bus_to_cdns(_bus) container_of(_bus, struct sdw_cdns, bus) diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c index 1e9c6df4b62c..e8855a2115f6 100644 --- a/drivers/soundwire/intel.c +++ b/drivers/soundwire/intel.c @@ -831,7 +831,7 @@ static int intel_hw_params(struct snd_pcm_substream *su= bstream, int ch, dir; int ret; =20 - dai_runtime =3D snd_soc_dai_get_dma_data(dai, substream); + dai_runtime =3D cdns->dai_runtime_array[dai->id]; if (!dai_runtime) return -EIO; =20 @@ -902,7 +902,7 @@ static int intel_prepare(struct snd_pcm_substream *subs= tream, int ch, dir; int ret =3D 0; =20 - dai_runtime =3D snd_soc_dai_get_dma_data(dai, substream); + dai_runtime =3D cdns->dai_runtime_array[dai->id]; if (!dai_runtime) { dev_err(dai->dev, "failed to get dai runtime in %s\n", __func__); @@ -949,7 +949,7 @@ intel_hw_free(struct snd_pcm_substream *substream, stru= ct snd_soc_dai *dai) struct sdw_cdns_dai_runtime *dai_runtime; int ret; =20 - dai_runtime =3D snd_soc_dai_get_dma_data(dai, substream); + dai_runtime =3D cdns->dai_runtime_array[dai->id]; if (!dai_runtime) return -EIO; =20 @@ -996,13 +996,10 @@ static int intel_pcm_set_sdw_stream(struct snd_soc_da= i *dai, static void *intel_get_sdw_stream(struct snd_soc_dai *dai, int direction) { + struct sdw_cdns *cdns =3D snd_soc_dai_get_drvdata(dai); struct sdw_cdns_dai_runtime *dai_runtime; =20 - if (direction =3D=3D SNDRV_PCM_STREAM_PLAYBACK) - dai_runtime =3D dai->playback_dma_data; - else - dai_runtime =3D dai->capture_dma_data; - + dai_runtime =3D cdns->dai_runtime_array[dai->id]; if (!dai_runtime) return ERR_PTR(-EINVAL); =20 @@ -1025,7 +1022,7 @@ static int intel_trigger(struct snd_pcm_substream *su= bstream, int cmd, struct sn if (res->ops && res->ops->trigger) res->ops->trigger(dai, cmd, substream->stream); =20 - dai_runtime =3D snd_soc_dai_get_dma_data(dai, substream); + dai_runtime =3D cdns->dai_runtime_array[dai->id]; if (!dai_runtime) { dev_err(dai->dev, "failed to get dai runtime in %s\n", __func__); @@ -1092,15 +1089,9 @@ static int intel_component_dais_suspend(struct snd_s= oc_component *component) struct sdw_cdns *cdns =3D snd_soc_dai_get_drvdata(dai); struct sdw_intel *sdw =3D cdns_to_intel(cdns); struct sdw_cdns_dai_runtime *dai_runtime; - int stream; int ret; =20 - dai_runtime =3D dai->playback_dma_data; - stream =3D SNDRV_PCM_STREAM_PLAYBACK; - if (!dai_runtime) { - dai_runtime =3D dai->capture_dma_data; - stream =3D SNDRV_PCM_STREAM_CAPTURE; - } + dai_runtime =3D cdns->dai_runtime_array[dai->id]; =20 if (!dai_runtime) continue; @@ -1111,7 +1102,7 @@ static int intel_component_dais_suspend(struct snd_so= c_component *component) if (dai_runtime->paused) { dai_runtime->suspended =3D true; =20 - ret =3D intel_free_stream(sdw, stream, dai, sdw->instance); + ret =3D intel_free_stream(sdw, dai_runtime->direction, dai, sdw->instan= ce); if (ret < 0) return ret; } @@ -1178,6 +1169,7 @@ static int intel_create_dai(struct sdw_cdns *cdns, =20 static int intel_register_dai(struct sdw_intel *sdw) { + struct sdw_cdns_dai_runtime **dai_runtime_array; struct sdw_cdns_stream_config config; struct sdw_cdns *cdns =3D &sdw->cdns; struct sdw_cdns_streams *stream; @@ -1195,6 +1187,13 @@ static int intel_register_dai(struct sdw_intel *sdw) /* DAIs are created based on total number of PDIs supported */ num_dai =3D cdns->pcm.num_pdi; =20 + dai_runtime_array =3D devm_kcalloc(cdns->dev, num_dai, + sizeof(struct sdw_cdns_dai_runtime *), + GFP_KERNEL); + if (!dai_runtime_array) + return -ENOMEM; + cdns->dai_runtime_array =3D dai_runtime_array; + dais =3D devm_kcalloc(cdns->dev, num_dai, sizeof(*dais), GFP_KERNEL); if (!dais) return -ENOMEM; --=20 2.25.1