From nobody Tue Jun 30 03:39:06 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 C9B55C5AC75 for ; Wed, 26 Jan 2022 01:17:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235632AbiAZBRg (ORCPT ); Tue, 25 Jan 2022 20:17:36 -0500 Received: from mga09.intel.com ([134.134.136.24]:5135 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235611AbiAZBRd (ORCPT ); Tue, 25 Jan 2022 20:17:33 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159853; x=1674695853; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=r96d366BOZOklC6E0TxFNatMgTAwkA3B2SyQlBSc03c=; b=FBLREh3MDHpwXJdRBdsc44dIvFJcqxuWtFLSIwa6AkLBPGyNobxgGKQu htpfr59KvmE5XTZE+AQXhHbfQYF2/kN87QQUXm3s5qqs2OwDWM4hxNSMZ nka30p1Wmz0RcoLR9kR1KNiu22MBJPltxlq8qqCt43PtOjR+juV+o0D/o r2Ip/uJZTOqVrwuWyb9Cjump2nnD5puKyASoRA4PqspVbQ7Oxpaj8EDuF w3Ku+vzBWpvuMbmfm4w1DwNPdpAHqaZ7BSsjo1w6Ac8bTUAlT4mR2OWiB SM5brL3nZPe53xdOukEnYflo6bRRgUJsKaLbNAXsnTFMabvK9XoHfC4JG Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236109" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="246236109" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:32 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="520617318" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:30 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 01/19] soundwire: stream: remove unused parameter in sdw_stream_add_slave Date: Wed, 26 Jan 2022 09:16:57 +0800 Message-Id: <20220126011715.28204-2-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart The stream parameter is not used, remove before further simplifications. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index 980f26d49b66..a30d0fb4871b 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -968,14 +968,12 @@ static struct sdw_master_runtime * * @slave: Slave handle * @stream_config: Stream configuration - * @stream: Stream runtime handle * * This function is to be called with bus_lock held. */ static struct sdw_slave_runtime *sdw_alloc_slave_rt(struct sdw_slave *slave, - struct sdw_stream_config *stream_config, - struct sdw_stream_runtime *stream) + struct sdw_stream_config *stream_config) { struct sdw_slave_runtime *s_rt; =20 @@ -1367,7 +1365,7 @@ int sdw_stream_add_slave(struct sdw_slave *slave, goto error; } =20 - s_rt =3D sdw_alloc_slave_rt(slave, stream_config, stream); + s_rt =3D sdw_alloc_slave_rt(slave, stream_config); if (!s_rt) { dev_err(&slave->dev, "Slave runtime config failed for stream:%s\n", --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 00E4AC3525A for ; Wed, 26 Jan 2022 01:17:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235634AbiAZBRh (ORCPT ); Tue, 25 Jan 2022 20:17:37 -0500 Received: from mga09.intel.com ([134.134.136.24]:5135 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235623AbiAZBRf (ORCPT ); Tue, 25 Jan 2022 20:17:35 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159855; x=1674695855; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=3xf4jfiB2XJp4alN6rFXrArNNBQgEJCYpcp1fFvmcbw=; b=UaP0AOP1YMAIPy4MlhC/RYP4SmiTtp0K0gXCbJ+HYoeHFGfDO57tDqFY qZSV+D1Q8hq1y+OkLvZVIGbJVlGVlS7FQ377GwYB0pbsEEP6CJjqfsO2+ BnDbMG0BDuEiskhp0C7bikcIcrNAvL50s96Rg1xSF9GbUKVENuMeKMCD/ rsNFYtsEAcQTl85clYFHpeiq23zxiYigalfVlow6xAEb7OafJGXI2doM6 KWkEJreFk5EIyHakhPktJ4hq7gQhZHOyrUR1Yg9KT+1OezTUWUJle5Mzu C8c8u7i+Xz+gSddgnhYedOPcROpCfRdh0lvq9fhF+zraN0ApwytGF9DYQ w==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236115" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="246236115" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:35 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="520617352" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:32 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 02/19] soundwire: stream: add slave runtime to list earlier Date: Wed, 26 Jan 2022 09:16:58 +0800 Message-Id: <20220126011715.28204-3-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart sdw_config_stream() only verifies the compatibility between information provided by the Slave driver and the stream configuration. There is no problem if we add the slave runtime to the list earlier. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index a30d0fb4871b..a75d3576bfcf 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -1373,21 +1373,12 @@ int sdw_stream_add_slave(struct sdw_slave *slave, ret =3D -ENOMEM; goto stream_error; } - - ret =3D sdw_config_stream(&slave->dev, stream, stream_config, true); - if (ret) { - /* - * sdw_release_master_stream will release s_rt in slave_rt_list in - * stream_error case, but s_rt is only added to slave_rt_list - * when sdw_config_stream is successful, so free s_rt explicitly - * when sdw_config_stream is failed. - */ - kfree(s_rt); - goto stream_error; - } - list_add_tail(&s_rt->m_rt_node, &m_rt->slave_rt_list); =20 + ret =3D sdw_config_stream(&slave->dev, stream, stream_config, true); + if (ret) + goto stream_error; + ret =3D sdw_slave_port_config(slave, s_rt, port_config, num_ports); if (ret) goto stream_error; --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 B7724C5AC75 for ; Wed, 26 Jan 2022 01:17:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235662AbiAZBRt (ORCPT ); Tue, 25 Jan 2022 20:17:49 -0500 Received: from mga09.intel.com ([134.134.136.24]:5135 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235637AbiAZBRi (ORCPT ); Tue, 25 Jan 2022 20:17:38 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159857; x=1674695857; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=7Vi0ipWt+SE4d8d/Oad96LsqbZ3AwLIRa7/Y3EQ/lyM=; b=R2Zvb547bjfpnbOKFVsT3AHmj/Don/DmJLOlme54kSGysTvNYUmd0vI0 K77IY5rMDmwWuVHAXr/Mffu94LP0fVc3HKh0bDAKk3Uz2Rme7o/GqK4Gu 6mbYuslIl85TjqlQhWxHDmScIRa3Kdza+bvZm8o16dc8Q9Q/COVn5u1xI OP7RaJdbD5tDCeHAptjwcaPTNt6LpQI7P4GRUXz3YkPfKi+z/+iUYrpD1 ppn5xy+bTTMhuvVrFwgbqUMtVOgiXoKk0CWDi4uYkX3Y4C48/kUdtpOIv ZyJXRRs5ux2uRk0iZU0cvH3ZI217Yhepu5UQZQUi2/x4rMRf6yDWbIys+ Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236128" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="246236128" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:37 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="520617385" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:35 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 03/19] soundwire: stream: simplify check on port range Date: Wed, 26 Jan 2022 09:16:59 +0800 Message-Id: <20220126011715.28204-4-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart Pass the index directly to sdw_is_valid_port_range(), this will be useful for further simplifications. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index a75d3576bfcf..3ac2e5a66700 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -1177,12 +1177,10 @@ static int sdw_config_stream(struct device *dev, return 0; } =20 -static int sdw_is_valid_port_range(struct device *dev, - struct sdw_port_runtime *p_rt) +static int sdw_is_valid_port_range(struct device *dev, int num) { - if (!SDW_VALID_PORT_RANGE(p_rt->num)) { - dev_err(dev, - "SoundWire: Invalid port number :%d\n", p_rt->num); + if (!SDW_VALID_PORT_RANGE(num)) { + dev_err(dev, "SoundWire: Invalid port number :%d\n", num); return -EINVAL; } =20 @@ -1249,7 +1247,7 @@ static int sdw_slave_port_config(struct sdw_slave *sl= ave, * TODO: Check valid port range as defined by DisCo/ * slave */ - ret =3D sdw_is_valid_port_range(&slave->dev, p_rt); + ret =3D sdw_is_valid_port_range(&slave->dev, port_config[i].num); if (ret < 0) { kfree(p_rt); return ret; --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 51810C5AC75 for ; Wed, 26 Jan 2022 01:17:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235656AbiAZBRz (ORCPT ); Tue, 25 Jan 2022 20:17:55 -0500 Received: from mga09.intel.com ([134.134.136.24]:5135 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235675AbiAZBRk (ORCPT ); Tue, 25 Jan 2022 20:17:40 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159860; x=1674695860; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=Y5QFgrRE6gbcfE8Im68LjhUmIaas2atxywqLCLJsx/Q=; b=Wlh3GDE34iPDvaK/vdZXNI787RIcv/hMWlyVeqSzUptecrCLlhAiujtx aMLKb/zV8XMFAB5j53e0815HpU+cAg5tYqw4nopJw6HYOxICvMX/+GNb0 ORDNyc6UZKOilwdRcQOjbRfEDutc75zdx48sz95yTmu/1h/1vt55Lvdjw dA+1bzShuVBO0wh5k6AsUguvJrZK4Ru32YI1hxQqkJjGEZuCUuLjiL4Ou foTRZvuMojtrHJ75XOJfCsP6owCCR8sN5xvha8mKKewNRhudSa1dPtpGq W7X1ou5XPEgPXpVgOxpaxkaZqle9tuQ5EM7PZR37ujwiIFUZvqMzr5k8g w==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236134" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="246236134" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:40 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="520617403" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:37 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 04/19] soundwire: stream: add alloc/config/free helpers for ports Date: Wed, 26 Jan 2022 09:17:00 +0800 Message-Id: <20220126011715.28204-5-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart The existing code only has a config helper that allocates memory, start adding alloc/config/free for ports, as a first step in the simplification of the stream API. This change removes a kfree() on a configuration error, this should have not impact on existing platforms and error handling will be revisited in follow-up patches to make sure invalid configurations have not impact on memory allocation. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 83 +++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 38 deletions(-) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index 3ac2e5a66700..49d3a8d2fa31 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -865,6 +865,39 @@ static int do_bank_switch(struct sdw_stream_runtime *s= tream) return ret; } =20 +static struct sdw_port_runtime *sdw_port_alloc(struct list_head *port_list) +{ + struct sdw_port_runtime *p_rt; + + p_rt =3D kzalloc(sizeof(*p_rt), GFP_KERNEL); + if (!p_rt) + return NULL; + + list_add_tail(&p_rt->port_node, port_list); + + return p_rt; +} + +static int sdw_port_config(struct sdw_port_runtime *p_rt, + struct sdw_port_config *port_config, + int port_index) +{ + p_rt->ch_mask =3D port_config[port_index].ch_mask; + p_rt->num =3D port_config[port_index].num; + + /* + * TODO: Check port capabilities for requested configuration + */ + + return 0; +} + +static void sdw_port_free(struct sdw_port_runtime *p_rt) +{ + list_del(&p_rt->port_node); + kfree(p_rt); +} + /** * sdw_release_stream() - Free the assigned stream runtime * @@ -995,8 +1028,7 @@ static void sdw_master_port_release(struct sdw_bus *bu= s, struct sdw_port_runtime *p_rt, *_p_rt; =20 list_for_each_entry_safe(p_rt, _p_rt, &m_rt->port_list, port_node) { - list_del(&p_rt->port_node); - kfree(p_rt); + sdw_port_free(p_rt); } } =20 @@ -1015,8 +1047,7 @@ static void sdw_slave_port_release(struct sdw_bus *bu= s, =20 list_for_each_entry_safe(p_rt, _p_rt, &s_rt->port_list, port_node) { - list_del(&p_rt->port_node); - kfree(p_rt); + sdw_port_free(p_rt); } } } @@ -1187,43 +1218,24 @@ static int sdw_is_valid_port_range(struct device *d= ev, int num) return 0; } =20 -static struct sdw_port_runtime -*sdw_port_alloc(struct device *dev, - struct sdw_port_config *port_config, - int port_index) -{ - struct sdw_port_runtime *p_rt; - - p_rt =3D kzalloc(sizeof(*p_rt), GFP_KERNEL); - if (!p_rt) - return NULL; - - p_rt->ch_mask =3D port_config[port_index].ch_mask; - p_rt->num =3D port_config[port_index].num; - - return p_rt; -} - static int sdw_master_port_config(struct sdw_bus *bus, struct sdw_master_runtime *m_rt, struct sdw_port_config *port_config, unsigned int num_ports) { struct sdw_port_runtime *p_rt; + int ret; int i; =20 /* Iterate for number of ports to perform initialization */ for (i =3D 0; i < num_ports; i++) { - p_rt =3D sdw_port_alloc(bus->dev, port_config, i); + p_rt =3D sdw_port_alloc(&m_rt->port_list); if (!p_rt) return -ENOMEM; =20 - /* - * TODO: Check port capabilities for requested - * configuration (audio mode support) - */ - - list_add_tail(&p_rt->port_node, &m_rt->port_list); + ret =3D sdw_port_config(p_rt, port_config, i); + if (ret < 0) + return ret; } =20 return 0; @@ -1239,7 +1251,7 @@ static int sdw_slave_port_config(struct sdw_slave *sl= ave, =20 /* Iterate for number of ports to perform initialization */ for (i =3D 0; i < num_config; i++) { - p_rt =3D sdw_port_alloc(&slave->dev, port_config, i); + p_rt =3D sdw_port_alloc(&s_rt->port_list); if (!p_rt) return -ENOMEM; =20 @@ -1248,17 +1260,12 @@ static int sdw_slave_port_config(struct sdw_slave *= slave, * slave */ ret =3D sdw_is_valid_port_range(&slave->dev, port_config[i].num); - if (ret < 0) { - kfree(p_rt); + if (ret < 0) return ret; - } =20 - /* - * TODO: Check port capabilities for requested - * configuration (audio mode support) - */ - - list_add_tail(&p_rt->port_node, &s_rt->port_list); + ret =3D sdw_port_config(p_rt, port_config, i); + if (ret < 0) + return ret; } =20 return 0; --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 45FD1C3525A for ; Wed, 26 Jan 2022 01:17:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235671AbiAZBR5 (ORCPT ); Tue, 25 Jan 2022 20:17:57 -0500 Received: from mga09.intel.com ([134.134.136.24]:5135 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235694AbiAZBRm (ORCPT ); Tue, 25 Jan 2022 20:17:42 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159862; x=1674695862; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=hRyebvpUmOlSx2YqWY7Ev21ywUBSfmUTYJfGzoRDvXo=; b=HDzqGu54oNgbeUooTJUOT0W4wf21Bd2LoEBTsuhKHEmbcaJaeuSNuj0Y 8z9CRJxOFUxs03a/fXBQn4JkJe7IUi5uejAPbbCp5970JRvcB5tEYUMOc kCiVeq9IZPQ0uC3TlK30xag4T4UcTl39hDf0ydCF+rnZ412be9PItNrOI ahOQ+xs9rDP42pd9kQ2OlH75l6cpsGxXsNpf2QyzTcsemGQakvlWS+w4l KcVL8zOab2TLGu1Nn6QQ5MS8uBZrd/NHZQuEwK/jx4i3EGoIaxlfukRys MYwuLAHTop/iTlLFSzQpw2Z35AKBRWUsL74Ps040ODYByfqMspaNRj/fd Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236142" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="246236142" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:42 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="520617427" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:40 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 05/19] soundwire: stream: split port allocation and configuration loops Date: Wed, 26 Jan 2022 09:17:01 +0800 Message-Id: <20220126011715.28204-6-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart Split loops before moving the allocation and configuration to separate functions. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index 49d3a8d2fa31..b97c59e71bdb 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -1232,10 +1232,14 @@ static int sdw_master_port_config(struct sdw_bus *b= us, p_rt =3D sdw_port_alloc(&m_rt->port_list); if (!p_rt) return -ENOMEM; + } =20 + i =3D 0; + list_for_each_entry(p_rt, &m_rt->port_list, port_node) { ret =3D sdw_port_config(p_rt, port_config, i); if (ret < 0) return ret; + i++; } =20 return 0; @@ -1254,7 +1258,10 @@ static int sdw_slave_port_config(struct sdw_slave *s= lave, p_rt =3D sdw_port_alloc(&s_rt->port_list); if (!p_rt) return -ENOMEM; + } =20 + i =3D 0; + list_for_each_entry(p_rt, &s_rt->port_list, port_node) { /* * TODO: Check valid port range as defined by DisCo/ * slave @@ -1266,6 +1273,7 @@ static int sdw_slave_port_config(struct sdw_slave *sl= ave, ret =3D sdw_port_config(p_rt, port_config, i); if (ret < 0) return ret; + i++; } =20 return 0; --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 05FF6C5DF62 for ; Wed, 26 Jan 2022 01:18:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235718AbiAZBR7 (ORCPT ); Tue, 25 Jan 2022 20:17:59 -0500 Received: from mga09.intel.com ([134.134.136.24]:5135 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235644AbiAZBRp (ORCPT ); Tue, 25 Jan 2022 20:17:45 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159865; x=1674695865; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=jHgJPNa8SPiX6zp1DNPAMTWl+vgD5iiQX0Bg4hGORN0=; b=ZJMrHB0vQ4PIc/PB+K/8wRD0/FwCKYqkC4T/bt/xA1sA2Xcx+TIaHGwg WW/LwnjnjxT5bTY6Bjq4P9vCqM8YJPMik5W9qSP51HGfToB/ekuRScg7r 6kqzezOUAnlM8hL8Lfzx4HmM1j6OYhVvl5As/sTImbT9AQ2mc1IPpmtRp b2m9RAyECOsE/+qg6eDSBgtdr/nlPSGaiXBRZIRvMfrX3e5n+bRl2Fnpo KR0+nmLx+smUjiCFm7XOwnIXgsCc3mcJ6GM/GpmBFlTT7iA1ZGaz7eB9p x49OL2cjYx9M0BPf8MoLeLgMFKrpQHLZ50tVPxx5u3ny4AwtV8TLumpH6 Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236154" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="246236154" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:44 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="520617449" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:42 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 06/19] soundwire: stream: split alloc and config in two functions Date: Wed, 26 Jan 2022 09:17:02 +0800 Message-Id: <20220126011715.28204-7-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart Continue the split with two functions for master and slave, and remove unused arguments. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 49 ++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index b97c59e71bdb..e3cb55de0d12 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -1218,13 +1218,10 @@ static int sdw_is_valid_port_range(struct device *d= ev, int num) return 0; } =20 -static int sdw_master_port_config(struct sdw_bus *bus, - struct sdw_master_runtime *m_rt, - struct sdw_port_config *port_config, - unsigned int num_ports) +static int sdw_master_port_alloc(struct sdw_master_runtime *m_rt, + unsigned int num_ports) { struct sdw_port_runtime *p_rt; - int ret; int i; =20 /* Iterate for number of ports to perform initialization */ @@ -1234,6 +1231,16 @@ static int sdw_master_port_config(struct sdw_bus *bu= s, return -ENOMEM; } =20 + return 0; +} + +static int sdw_master_port_config(struct sdw_master_runtime *m_rt, + struct sdw_port_config *port_config) +{ + struct sdw_port_runtime *p_rt; + int ret; + int i; + i =3D 0; list_for_each_entry(p_rt, &m_rt->port_list, port_node) { ret =3D sdw_port_config(p_rt, port_config, i); @@ -1245,13 +1252,12 @@ static int sdw_master_port_config(struct sdw_bus *b= us, return 0; } =20 -static int sdw_slave_port_config(struct sdw_slave *slave, - struct sdw_slave_runtime *s_rt, - struct sdw_port_config *port_config, - unsigned int num_config) +static int sdw_slave_port_alloc(struct sdw_slave *slave, + struct sdw_slave_runtime *s_rt, + unsigned int num_config) { struct sdw_port_runtime *p_rt; - int i, ret; + int i; =20 /* Iterate for number of ports to perform initialization */ for (i =3D 0; i < num_config; i++) { @@ -1260,6 +1266,17 @@ static int sdw_slave_port_config(struct sdw_slave *s= lave, return -ENOMEM; } =20 + return 0; +} + +static int sdw_slave_port_config(struct sdw_slave *slave, + struct sdw_slave_runtime *s_rt, + struct sdw_port_config *port_config) +{ + struct sdw_port_runtime *p_rt; + int ret; + int i; + i =3D 0; list_for_each_entry(p_rt, &s_rt->port_list, port_node) { /* @@ -1324,7 +1341,11 @@ int sdw_stream_add_master(struct sdw_bus *bus, if (ret) goto stream_error; =20 - ret =3D sdw_master_port_config(bus, m_rt, port_config, num_ports); + ret =3D sdw_master_port_alloc(m_rt, num_ports); + if (ret) + goto stream_error; + + ret =3D sdw_master_port_config(m_rt, port_config); if (ret) goto stream_error; =20 @@ -1392,7 +1413,11 @@ int sdw_stream_add_slave(struct sdw_slave *slave, if (ret) goto stream_error; =20 - ret =3D sdw_slave_port_config(slave, s_rt, port_config, num_ports); + ret =3D sdw_slave_port_alloc(slave, s_rt, num_ports); + if (ret) + goto stream_error; + + ret =3D sdw_slave_port_config(slave, s_rt, port_config); if (ret) goto stream_error; =20 --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 EB227C5AC75 for ; Wed, 26 Jan 2022 01:18:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235737AbiAZBSB (ORCPT ); Tue, 25 Jan 2022 20:18:01 -0500 Received: from mga09.intel.com ([134.134.136.24]:5166 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235667AbiAZBRr (ORCPT ); Tue, 25 Jan 2022 20:17:47 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159867; x=1674695867; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=xZmGpFkcCtXPjWmVmWhZ85WsZ2zk0Q4pSLwBoWfgeT8=; b=bGhzR+OkGmmkbhJcyt+FGpD00ZK7JScUf90U6TqtYYI9fjem1fvizZyC oVyl0SPkFHkl/mSgYnO+R3sPIbyljnrun1QchzcvuLjFmqwzUGMI/9RMZ sXwVuVmDuRbw2UGtFpEZS15aRAJHm9bQKm71sCj1OJhyxrzUqKLgp9NOu QQiyo3HdC+alTfv2dZjWVqMArGkxtVDpbZM7lBGS0qzpimx9EelcPNOPt R2kiYUj2RhlNEHJCKB+k47BFhP02NDPiQf5/Sqfp2g5wxlwcfX4l5t31D 99uVG9PAcN0DGTuOqE/q/NGmfKB++33wa2rkrLHPVkxEI66Hs9B8Z81Tb w==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236164" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="246236164" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:47 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="520617471" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:45 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 07/19] soundwire: stream: add 'slave' prefix for port range checks Date: Wed, 26 Jan 2022 09:17:03 +0800 Message-Id: <20220126011715.28204-8-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart We can only check for Slave port ranges, the ports are not defined at the Master level. Also move the function to the 'slave port' block. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index e3cb55de0d12..c326298a0fe2 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -1208,16 +1208,6 @@ static int sdw_config_stream(struct device *dev, return 0; } =20 -static int sdw_is_valid_port_range(struct device *dev, int num) -{ - if (!SDW_VALID_PORT_RANGE(num)) { - dev_err(dev, "SoundWire: Invalid port number :%d\n", num); - return -EINVAL; - } - - return 0; -} - static int sdw_master_port_alloc(struct sdw_master_runtime *m_rt, unsigned int num_ports) { @@ -1269,6 +1259,16 @@ static int sdw_slave_port_alloc(struct sdw_slave *sl= ave, return 0; } =20 +static int sdw_slave_port_is_valid_range(struct device *dev, int num) +{ + if (!SDW_VALID_PORT_RANGE(num)) { + dev_err(dev, "SoundWire: Invalid port number :%d\n", num); + return -EINVAL; + } + + return 0; +} + static int sdw_slave_port_config(struct sdw_slave *slave, struct sdw_slave_runtime *s_rt, struct sdw_port_config *port_config) @@ -1283,7 +1283,7 @@ static int sdw_slave_port_config(struct sdw_slave *sl= ave, * TODO: Check valid port range as defined by DisCo/ * slave */ - ret =3D sdw_is_valid_port_range(&slave->dev, port_config[i].num); + ret =3D sdw_slave_port_is_valid_range(&slave->dev, port_config[i].num); if (ret < 0) return ret; =20 --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 A6C57C5AC75 for ; Wed, 26 Jan 2022 01:18:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235717AbiAZBSE (ORCPT ); Tue, 25 Jan 2022 20:18:04 -0500 Received: from mga09.intel.com ([134.134.136.24]:5135 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235674AbiAZBRw (ORCPT ); Tue, 25 Jan 2022 20:17:52 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159872; x=1674695872; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=JOSj0p7UUWlQeCOb35AUBPW7MKDklglz0v2cDMR9q8s=; b=R5F3XgEuwYvrGoEmZibAmFVEPb/+106Y4kn0aYqjU17IMx63UilmKapS WI/RoStgCsbwef0M64psNU1hd4FHAGnnIx2Jhe8LANgmhL5l6D0W2GrIM I1d/65NNU74IuHNgy0+VgL2CJs9wavXp/aFsG9qNOW5P2rXrXUHEBrO4v hVLyKtOQg43rHJ6MAEztqHdgZJBXBu3vKSQ2zshwmkT2rE8gQnhf0KYrR uPAtLxJ78Sdvfq93PyLYZ/YSuf/+h7+0j1lAbWW3Pc/V9WTTkpDy9zGa6 K+LIpe/Vf3e53lLjYvLZN9rRfsj0gy6AGChHuPlU1UFO2dbLuZJtW15fp Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236175" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="246236175" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:51 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="520617494" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:47 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 08/19] soundwire: stream: group sdw_port and sdw_master/slave_port functions Date: Wed, 26 Jan 2022 09:17:04 +0800 Message-Id: <20220126011715.28204-9-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart re-group all the helpers in one location with a code move. For consistency the 'slave' helpers are placed before the 'master' helpers. Also remove unused arguments and rename the 'release' function to 'free' for consistency. No functional change in this patch. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 242 ++++++++++++++++++------------------- 1 file changed, 120 insertions(+), 122 deletions(-) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index c326298a0fe2..5e2d29448aaf 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -898,6 +898,123 @@ static void sdw_port_free(struct sdw_port_runtime *p_= rt) kfree(p_rt); } =20 +static void sdw_slave_port_free(struct sdw_slave *slave, + struct sdw_stream_runtime *stream) +{ + struct sdw_port_runtime *p_rt, *_p_rt; + struct sdw_master_runtime *m_rt; + struct sdw_slave_runtime *s_rt; + + list_for_each_entry(m_rt, &stream->master_list, stream_node) { + list_for_each_entry(s_rt, &m_rt->slave_rt_list, m_rt_node) { + if (s_rt->slave !=3D slave) + continue; + + list_for_each_entry_safe(p_rt, _p_rt, + &s_rt->port_list, port_node) { + sdw_port_free(p_rt); + } + } + } +} + +static int sdw_slave_port_alloc(struct sdw_slave *slave, + struct sdw_slave_runtime *s_rt, + unsigned int num_config) +{ + struct sdw_port_runtime *p_rt; + int i; + + /* Iterate for number of ports to perform initialization */ + for (i =3D 0; i < num_config; i++) { + p_rt =3D sdw_port_alloc(&s_rt->port_list); + if (!p_rt) + return -ENOMEM; + } + + return 0; +} + +static int sdw_slave_port_is_valid_range(struct device *dev, int num) +{ + if (!SDW_VALID_PORT_RANGE(num)) { + dev_err(dev, "SoundWire: Invalid port number :%d\n", num); + return -EINVAL; + } + + return 0; +} + +static int sdw_slave_port_config(struct sdw_slave *slave, + struct sdw_slave_runtime *s_rt, + struct sdw_port_config *port_config) +{ + struct sdw_port_runtime *p_rt; + int ret; + int i; + + i =3D 0; + list_for_each_entry(p_rt, &s_rt->port_list, port_node) { + /* + * TODO: Check valid port range as defined by DisCo/ + * slave + */ + ret =3D sdw_slave_port_is_valid_range(&slave->dev, port_config[i].num); + if (ret < 0) + return ret; + + ret =3D sdw_port_config(p_rt, port_config, i); + if (ret < 0) + return ret; + i++; + } + + return 0; +} + +static void sdw_master_port_free(struct sdw_master_runtime *m_rt) +{ + struct sdw_port_runtime *p_rt, *_p_rt; + + list_for_each_entry_safe(p_rt, _p_rt, &m_rt->port_list, port_node) { + sdw_port_free(p_rt); + } +} + +static int sdw_master_port_alloc(struct sdw_master_runtime *m_rt, + unsigned int num_ports) +{ + struct sdw_port_runtime *p_rt; + int i; + + /* Iterate for number of ports to perform initialization */ + for (i =3D 0; i < num_ports; i++) { + p_rt =3D sdw_port_alloc(&m_rt->port_list); + if (!p_rt) + return -ENOMEM; + } + + return 0; +} + +static int sdw_master_port_config(struct sdw_master_runtime *m_rt, + struct sdw_port_config *port_config) +{ + struct sdw_port_runtime *p_rt; + int ret; + int i; + + i =3D 0; + list_for_each_entry(p_rt, &m_rt->port_list, port_node) { + ret =3D sdw_port_config(p_rt, port_config, i); + if (ret < 0) + return ret; + i++; + } + + return 0; +} + /** * sdw_release_stream() - Free the assigned stream runtime * @@ -1022,37 +1139,6 @@ static struct sdw_slave_runtime return s_rt; } =20 -static void sdw_master_port_release(struct sdw_bus *bus, - struct sdw_master_runtime *m_rt) -{ - struct sdw_port_runtime *p_rt, *_p_rt; - - list_for_each_entry_safe(p_rt, _p_rt, &m_rt->port_list, port_node) { - sdw_port_free(p_rt); - } -} - -static void sdw_slave_port_release(struct sdw_bus *bus, - struct sdw_slave *slave, - struct sdw_stream_runtime *stream) -{ - struct sdw_port_runtime *p_rt, *_p_rt; - struct sdw_master_runtime *m_rt; - struct sdw_slave_runtime *s_rt; - - list_for_each_entry(m_rt, &stream->master_list, stream_node) { - list_for_each_entry(s_rt, &m_rt->slave_rt_list, m_rt_node) { - if (s_rt->slave !=3D slave) - continue; - - list_for_each_entry_safe(p_rt, _p_rt, - &s_rt->port_list, port_node) { - sdw_port_free(p_rt); - } - } - } -} - /** * sdw_release_slave_stream() - Free Slave(s) runtime handle * @@ -1097,7 +1183,7 @@ static void sdw_release_master_stream(struct sdw_mast= er_runtime *m_rt, struct sdw_slave_runtime *s_rt, *_s_rt; =20 list_for_each_entry_safe(s_rt, _s_rt, &m_rt->slave_rt_list, m_rt_node) { - sdw_slave_port_release(s_rt->slave->bus, s_rt->slave, stream); + sdw_slave_port_free(s_rt->slave, stream); sdw_release_slave_stream(s_rt->slave, stream); } =20 @@ -1126,7 +1212,7 @@ int sdw_stream_remove_master(struct sdw_bus *bus, if (m_rt->bus !=3D bus) continue; =20 - sdw_master_port_release(bus, m_rt); + sdw_master_port_free(m_rt); sdw_release_master_stream(m_rt, stream); stream->m_rt_count--; } @@ -1153,7 +1239,7 @@ int sdw_stream_remove_slave(struct sdw_slave *slave, { mutex_lock(&slave->bus->bus_lock); =20 - sdw_slave_port_release(slave->bus, slave, stream); + sdw_slave_port_free(slave, stream); sdw_release_slave_stream(slave, stream); =20 mutex_unlock(&slave->bus->bus_lock); @@ -1208,94 +1294,6 @@ static int sdw_config_stream(struct device *dev, return 0; } =20 -static int sdw_master_port_alloc(struct sdw_master_runtime *m_rt, - unsigned int num_ports) -{ - struct sdw_port_runtime *p_rt; - int i; - - /* Iterate for number of ports to perform initialization */ - for (i =3D 0; i < num_ports; i++) { - p_rt =3D sdw_port_alloc(&m_rt->port_list); - if (!p_rt) - return -ENOMEM; - } - - return 0; -} - -static int sdw_master_port_config(struct sdw_master_runtime *m_rt, - struct sdw_port_config *port_config) -{ - struct sdw_port_runtime *p_rt; - int ret; - int i; - - i =3D 0; - list_for_each_entry(p_rt, &m_rt->port_list, port_node) { - ret =3D sdw_port_config(p_rt, port_config, i); - if (ret < 0) - return ret; - i++; - } - - return 0; -} - -static int sdw_slave_port_alloc(struct sdw_slave *slave, - struct sdw_slave_runtime *s_rt, - unsigned int num_config) -{ - struct sdw_port_runtime *p_rt; - int i; - - /* Iterate for number of ports to perform initialization */ - for (i =3D 0; i < num_config; i++) { - p_rt =3D sdw_port_alloc(&s_rt->port_list); - if (!p_rt) - return -ENOMEM; - } - - return 0; -} - -static int sdw_slave_port_is_valid_range(struct device *dev, int num) -{ - if (!SDW_VALID_PORT_RANGE(num)) { - dev_err(dev, "SoundWire: Invalid port number :%d\n", num); - return -EINVAL; - } - - return 0; -} - -static int sdw_slave_port_config(struct sdw_slave *slave, - struct sdw_slave_runtime *s_rt, - struct sdw_port_config *port_config) -{ - struct sdw_port_runtime *p_rt; - int ret; - int i; - - i =3D 0; - list_for_each_entry(p_rt, &s_rt->port_list, port_node) { - /* - * TODO: Check valid port range as defined by DisCo/ - * slave - */ - ret =3D sdw_slave_port_is_valid_range(&slave->dev, port_config[i].num); - if (ret < 0) - return ret; - - ret =3D sdw_port_config(p_rt, port_config, i); - if (ret < 0) - return ret; - i++; - } - - return 0; -} - /** * sdw_stream_add_master() - Allocate and add master runtime to a stream * --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 BA1BBC5AC75 for ; Wed, 26 Jan 2022 01:18:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235740AbiAZBSG (ORCPT ); Tue, 25 Jan 2022 20:18:06 -0500 Received: from mga09.intel.com ([134.134.136.24]:5177 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235693AbiAZBRz (ORCPT ); Tue, 25 Jan 2022 20:17:55 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159875; x=1674695875; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=dL1KHyWmbzK6Rny1+Jx1gBeDHgqwGVS/OLQiDKKLSaU=; b=OVdv4PQYeYNYJGxirG4Vgt8F50UMEkcTcnUHp1A7KcBly76m5UMtlBAE VqofmXeLjwUG66ppJqUkV9NDADpbCvkDTqjvSMlNS/sHjsRouWdtMLDwh aIPC/RrrUJgu3UBeciYHf7NA3NVXTBi4ZhzFHwqjjXPPSdAgYqEKGM19+ TQHYPxh1Ti0kXdB5KqwH5ARWXf9wWLLVj8f/ikG9gxnOz5yg8OrU1sHuy hbkcV6UD7U895IVAD2059H3a4H7tgutVVexIn47q3dabePXcTKc22+V27 d4LfLRqUSIdGC28GLgN17mnfDUI1eCExDPm2b0wsWoqIkzjNZSt2e8Ysl w==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236184" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="246236184" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:54 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="520617508" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:51 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 09/19] soundwire: stream: simplify sdw_alloc_master_rt() Date: Wed, 26 Jan 2022 09:17:05 +0800 Message-Id: <20220126011715.28204-10-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart Only do the allocation in that function, and move check for allocation in the caller. This will it easier to split allocation and configuration. No functionality change in this patch. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index 5e2d29448aaf..263b76230f8f 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -1085,14 +1085,6 @@ static struct sdw_master_runtime { struct sdw_master_runtime *m_rt; =20 - /* - * check if Master is already allocated (as a result of Slave adding - * it first), if so skip allocation and go to configure - */ - m_rt =3D sdw_find_master_rt(bus, stream); - if (m_rt) - goto stream_config; - m_rt =3D kzalloc(sizeof(*m_rt), GFP_KERNEL); if (!m_rt) return NULL; @@ -1104,7 +1096,6 @@ static struct sdw_master_runtime =20 list_add_tail(&m_rt->bus_node, &bus->m_rt_list); =20 -stream_config: m_rt->ch_count =3D stream_config->ch_count; m_rt->bus =3D bus; m_rt->stream =3D stream; @@ -1326,6 +1317,14 @@ int sdw_stream_add_master(struct sdw_bus *bus, goto unlock; } =20 + /* + * check if Master is already allocated (e.g. as a result of Slave adding + * it first), if so skip allocation and go to configuration + */ + m_rt =3D sdw_find_master_rt(bus, stream); + if (m_rt) + goto skip_alloc_master_rt; + m_rt =3D sdw_alloc_master_rt(bus, stream_config, stream); if (!m_rt) { dev_err(bus->dev, @@ -1335,6 +1334,7 @@ int sdw_stream_add_master(struct sdw_bus *bus, goto unlock; } =20 +skip_alloc_master_rt: ret =3D sdw_config_stream(bus->dev, stream, stream_config, false); if (ret) goto stream_error; @@ -1384,6 +1384,14 @@ int sdw_stream_add_slave(struct sdw_slave *slave, =20 mutex_lock(&slave->bus->bus_lock); =20 + /* + * check if Master is already allocated, if so skip allocation + * and go to configuration + */ + m_rt =3D sdw_find_master_rt(slave->bus, stream); + if (m_rt) + goto skip_alloc_master_rt; + /* * If this API is invoked by Slave first then m_rt is not valid. * So, allocate m_rt and add Slave to it. @@ -1397,6 +1405,7 @@ int sdw_stream_add_slave(struct sdw_slave *slave, goto error; } =20 +skip_alloc_master_rt: s_rt =3D sdw_alloc_slave_rt(slave, stream_config); if (!s_rt) { dev_err(&slave->dev, --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 CBBC3C3525A for ; Wed, 26 Jan 2022 01:18:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235743AbiAZBSK (ORCPT ); Tue, 25 Jan 2022 20:18:10 -0500 Received: from mga09.intel.com ([134.134.136.24]:5181 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235660AbiAZBR5 (ORCPT ); Tue, 25 Jan 2022 20:17:57 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159877; x=1674695877; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=Rck6GQHkEM2Tw3dk9P1Wljy6YtVFUEjagAG7ehSug/0=; b=gZPbcPmqhnO1VgD5dLmbQ4ifZJks5xVH+W9jrOdQCXsHD01L8hGAtwMG 5Iqgv74lOucXhtEQ0o6eWHoPemBUT0WIYXEBR4gzPV8epX83XtkAsnGcn oJysgai02E/4NoeEaULqmcZ9frjFeB87eCpTk+JLGGb/y+niITznAvL70 kid4uQdvwGVknPY+snyRVAF6l+fQiV36MUeYpSpvpqu5CoNp20xVEImzm SzxxC2t87Ztu9iX9G4afrZEKucSHYYqAgZo11gpO5Fxqg78gXqhkV3pRP tIExbOGJsRNEf/cKjZyNloMwZUJ2D4tgnm9FkoY8E3mU7gRKt8gVO55z/ A==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236191" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208,217";a="246236191" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:56 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208,217";a="520617525" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:54 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 10/19] soundwire: stream: split sdw_alloc_master_rt() in alloc and config Date: Wed, 26 Jan 2022 09:17:06 +0800 Message-Id: <20220126011715.28204-11-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart Split the two parts so that we can do multiple configurations during ALSA/ASoC hw_params stage. Also follow existing convention sdw__ used at lower level. No functionality change here. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 51 +++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index 263b76230f8f..e38c9208c77b 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -1055,7 +1055,7 @@ struct sdw_stream_runtime *sdw_alloc_stream(const cha= r *stream_name) EXPORT_SYMBOL(sdw_alloc_stream); =20 static struct sdw_master_runtime -*sdw_find_master_rt(struct sdw_bus *bus, +*sdw_master_rt_find(struct sdw_bus *bus, struct sdw_stream_runtime *stream) { struct sdw_master_runtime *m_rt; @@ -1070,17 +1070,15 @@ static struct sdw_master_runtime } =20 /** - * sdw_alloc_master_rt() - Allocates and initialize Master runtime handle + * sdw_master_rt_alloc() - Allocates a Master runtime handle * * @bus: SDW bus instance - * @stream_config: Stream configuration * @stream: Stream runtime handle. * * This function is to be called with bus_lock held. */ static struct sdw_master_runtime -*sdw_alloc_master_rt(struct sdw_bus *bus, - struct sdw_stream_config *stream_config, +*sdw_master_rt_alloc(struct sdw_bus *bus, struct sdw_stream_runtime *stream) { struct sdw_master_runtime *m_rt; @@ -1096,14 +1094,30 @@ static struct sdw_master_runtime =20 list_add_tail(&m_rt->bus_node, &bus->m_rt_list); =20 - m_rt->ch_count =3D stream_config->ch_count; m_rt->bus =3D bus; m_rt->stream =3D stream; - m_rt->direction =3D stream_config->direction; =20 return m_rt; } =20 +/** + * sdw_master_rt_config() - Configure Master runtime handle + * + * @m_rt: Master runtime handle + * @stream_config: Stream configuration + * + * This function is to be called with bus_lock held. + */ + +static int sdw_master_rt_config(struct sdw_master_runtime *m_rt, + struct sdw_stream_config *stream_config) +{ + m_rt->ch_count =3D stream_config->ch_count; + m_rt->direction =3D stream_config->direction; + + return 0; +} + /** * sdw_alloc_slave_rt() - Allocate and initialize Slave runtime handle. * @@ -1321,19 +1335,21 @@ int sdw_stream_add_master(struct sdw_bus *bus, * check if Master is already allocated (e.g. as a result of Slave adding * it first), if so skip allocation and go to configuration */ - m_rt =3D sdw_find_master_rt(bus, stream); + m_rt =3D sdw_master_rt_find(bus, stream); if (m_rt) goto skip_alloc_master_rt; =20 - m_rt =3D sdw_alloc_master_rt(bus, stream_config, stream); + m_rt =3D sdw_master_rt_alloc(bus, stream); if (!m_rt) { - dev_err(bus->dev, - "Master runtime config failed for stream:%s\n", - stream->name); + dev_err(bus->dev, "Master runtime alloc failed for stream:%s\n", stream-= >name); ret =3D -ENOMEM; goto unlock; } =20 + ret =3D sdw_master_rt_config(m_rt, stream_config); + if (ret < 0) + goto unlock; + skip_alloc_master_rt: ret =3D sdw_config_stream(bus->dev, stream, stream_config, false); if (ret) @@ -1388,7 +1404,7 @@ int sdw_stream_add_slave(struct sdw_slave *slave, * check if Master is already allocated, if so skip allocation * and go to configuration */ - m_rt =3D sdw_find_master_rt(slave->bus, stream); + m_rt =3D sdw_master_rt_find(slave->bus, stream); if (m_rt) goto skip_alloc_master_rt; =20 @@ -1396,14 +1412,15 @@ int sdw_stream_add_slave(struct sdw_slave *slave, * If this API is invoked by Slave first then m_rt is not valid. * So, allocate m_rt and add Slave to it. */ - m_rt =3D sdw_alloc_master_rt(slave->bus, stream_config, stream); + m_rt =3D sdw_master_rt_alloc(slave->bus, stream); if (!m_rt) { - dev_err(&slave->dev, - "alloc master runtime failed for stream:%s\n", - stream->name); + dev_err(&slave->dev, "Master runtime alloc failed for stream:%s\n", stre= am->name); ret =3D -ENOMEM; goto error; } + ret =3D sdw_master_rt_config(m_rt, stream_config); + if (ret < 0) + goto stream_error; =20 skip_alloc_master_rt: s_rt =3D sdw_alloc_slave_rt(slave, stream_config); --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 D9284C5AC75 for ; Wed, 26 Jan 2022 01:18:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235781AbiAZBSQ (ORCPT ); Tue, 25 Jan 2022 20:18:16 -0500 Received: from mga09.intel.com ([134.134.136.24]:5188 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235720AbiAZBR7 (ORCPT ); Tue, 25 Jan 2022 20:17:59 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159879; x=1674695879; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=j9FedpyuD/S2NgO/mc5ZrDZt8ygTqEiARrruER7q7HU=; b=NXXZhihv2EJTIU7kQqEPmachCItzWqxccMCb+ThfikEiLNqtWOCrztEn PMhVu9CwKFoV1yEBGnMZWUl5F8UsmSNyhA8VgOrc2Fv6ScxSdHH+GAWbK B+/xtz2F5Ct2Edx0zjBmK7b8GXDfI5WrR4SrUhVkjR0HfWbNQm47JFTFF bP7jntxLdT9SIy3Qo/YBb+F7qr7WgIVYHGiYnNQhPR+EmtpLN7E1Y/Onu /Cxe1GSoiq9Gsi31y/rO4NqZidEyPzaQwpS0Uo5eYRnC37qXZWgt+jtfw iLfHJPx0Et/G8WU+k6lvbVApNly4mJ4NvRqmxdG5SBPUZkkpuJH94HiMF g==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236199" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="246236199" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:59 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="520617541" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:56 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 11/19] soundwire: stream: move sdw_alloc_slave_rt() before 'master' helpers Date: Wed, 26 Jan 2022 09:17:07 +0800 Message-Id: <20220126011715.28204-12-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart Code move before splitting the function in two. No functionality change. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 52 +++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index e38c9208c77b..eef2e5fd245e 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -1054,6 +1054,32 @@ struct sdw_stream_runtime *sdw_alloc_stream(const ch= ar *stream_name) } EXPORT_SYMBOL(sdw_alloc_stream); =20 +/** + * sdw_alloc_slave_rt() - Allocate and initialize Slave runtime handle. + * + * @slave: Slave handle + * @stream_config: Stream configuration + * + * This function is to be called with bus_lock held. + */ +static struct sdw_slave_runtime +*sdw_alloc_slave_rt(struct sdw_slave *slave, + struct sdw_stream_config *stream_config) +{ + struct sdw_slave_runtime *s_rt; + + s_rt =3D kzalloc(sizeof(*s_rt), GFP_KERNEL); + if (!s_rt) + return NULL; + + INIT_LIST_HEAD(&s_rt->port_list); + s_rt->ch_count =3D stream_config->ch_count; + s_rt->direction =3D stream_config->direction; + s_rt->slave =3D slave; + + return s_rt; +} + static struct sdw_master_runtime *sdw_master_rt_find(struct sdw_bus *bus, struct sdw_stream_runtime *stream) @@ -1118,32 +1144,6 @@ static int sdw_master_rt_config(struct sdw_master_ru= ntime *m_rt, return 0; } =20 -/** - * sdw_alloc_slave_rt() - Allocate and initialize Slave runtime handle. - * - * @slave: Slave handle - * @stream_config: Stream configuration - * - * This function is to be called with bus_lock held. - */ -static struct sdw_slave_runtime -*sdw_alloc_slave_rt(struct sdw_slave *slave, - struct sdw_stream_config *stream_config) -{ - struct sdw_slave_runtime *s_rt; - - s_rt =3D kzalloc(sizeof(*s_rt), GFP_KERNEL); - if (!s_rt) - return NULL; - - INIT_LIST_HEAD(&s_rt->port_list); - s_rt->ch_count =3D stream_config->ch_count; - s_rt->direction =3D stream_config->direction; - s_rt->slave =3D slave; - - return s_rt; -} - /** * sdw_release_slave_stream() - Free Slave(s) runtime handle * --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 C1BB0C3525A for ; Wed, 26 Jan 2022 01:18:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235803AbiAZBSS (ORCPT ); Tue, 25 Jan 2022 20:18:18 -0500 Received: from mga09.intel.com ([134.134.136.24]:5195 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235744AbiAZBSB (ORCPT ); Tue, 25 Jan 2022 20:18:01 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159881; x=1674695881; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=ktNU35jvB6Wlvb2Vej7NMspOL8Sc09iGaTQH2Ct64/4=; b=FcqxsUjRAqgdoMIShFY8eatdY9tvbdEfSJUSxAkOsb2vfJ039pmIFTQJ NtUU9f3mpabQNAYt7bIgNPSfscSxzJngfRGu62XC8vqMEAcRsmQ7I5wO2 roZUJt/2GBks5UKY1Wa7EGnxx/iDoztcNU5H0AC/d0ahWZ2Hgy5yH4pRq BBO2AKAKzQ2x6F1iRFvax6OKMtNbVTMJyyvg7B7yO+GSTIX+QaPMg2ili iUCjyIem74w8jH9F+Ej+rNXmP8PZrtTQRn0w95wfezaP8T5GHYoF1Ap3U wyH3/2rVnidi6JLCVRsdb6QA2RCLi7Hi0yLdECpheXud+Ug4hB7qbWXq2 A==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236207" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208,217";a="246236207" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:18:01 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208,217";a="520617564" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:17:59 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 12/19] soundwire: stream: split sdw_alloc_slave_rt() in alloc and config Date: Wed, 26 Jan 2022 09:17:08 +0800 Message-Id: <20220126011715.28204-13-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart Split the two parts so that we can do multiple configurations during ALSA/ASoC hw_params stage. Also follow existing convention sdw__ used at lower level. No functionality change here. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index eef2e5fd245e..b7ccfa5a9cfc 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -1055,16 +1055,14 @@ struct sdw_stream_runtime *sdw_alloc_stream(const c= har *stream_name) EXPORT_SYMBOL(sdw_alloc_stream); =20 /** - * sdw_alloc_slave_rt() - Allocate and initialize Slave runtime handle. + * sdw_slave_rt_alloc() - Allocate a Slave runtime handle. * * @slave: Slave handle - * @stream_config: Stream configuration * * This function is to be called with bus_lock held. */ static struct sdw_slave_runtime -*sdw_alloc_slave_rt(struct sdw_slave *slave, - struct sdw_stream_config *stream_config) +*sdw_slave_rt_alloc(struct sdw_slave *slave) { struct sdw_slave_runtime *s_rt; =20 @@ -1073,13 +1071,28 @@ static struct sdw_slave_runtime return NULL; =20 INIT_LIST_HEAD(&s_rt->port_list); - s_rt->ch_count =3D stream_config->ch_count; - s_rt->direction =3D stream_config->direction; s_rt->slave =3D slave; =20 return s_rt; } =20 +/** + * sdw_slave_rt_config() - Configure a Slave runtime handle. + * + * @s_rt: Slave runtime handle + * @stream_config: Stream configuration + * + * This function is to be called with bus_lock held. + */ +static int sdw_slave_rt_config(struct sdw_slave_runtime *s_rt, + struct sdw_stream_config *stream_config) +{ + s_rt->ch_count =3D stream_config->ch_count; + s_rt->direction =3D stream_config->direction; + + return 0; +} + static struct sdw_master_runtime *sdw_master_rt_find(struct sdw_bus *bus, struct sdw_stream_runtime *stream) @@ -1423,16 +1436,18 @@ int sdw_stream_add_slave(struct sdw_slave *slave, goto stream_error; =20 skip_alloc_master_rt: - s_rt =3D sdw_alloc_slave_rt(slave, stream_config); + s_rt =3D sdw_slave_rt_alloc(slave); if (!s_rt) { - dev_err(&slave->dev, - "Slave runtime config failed for stream:%s\n", - stream->name); + dev_err(&slave->dev, "Slave runtime alloc failed for stream:%s\n", strea= m->name); ret =3D -ENOMEM; goto stream_error; } list_add_tail(&s_rt->m_rt_node, &m_rt->slave_rt_list); =20 + ret =3D sdw_slave_rt_config(s_rt, stream_config); + if (ret) + goto stream_error; + ret =3D sdw_config_stream(&slave->dev, stream, stream_config, true); if (ret) goto stream_error; --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 9F865C5AC75 for ; Wed, 26 Jan 2022 01:18:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235866AbiAZBS3 (ORCPT ); Tue, 25 Jan 2022 20:18:29 -0500 Received: from mga09.intel.com ([134.134.136.24]:5200 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235784AbiAZBSK (ORCPT ); Tue, 25 Jan 2022 20:18:10 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159890; x=1674695890; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=wkKJ3f6Qzg0/Fp1c1I/fn7a5yHFKHd8NwTtbxFMF3LM=; b=kG+M+a54jWMgLMHAP4YWMyQeSxid1ifHlVbxSvcf1PVierawDq46AIaG 4W7pBABg10BSpnEiSVZnT81V4eCQxMkSMvkkdHta2K+4fj1S7I8aWWGKz /a5B9ykleAZ6KrbeLHb615YzNOkezEiBFcXDmAJ+SFhzYXuXYTZH1qtb6 vMEzuBn/At+6xiMvFMDp/FcTgSXLupm5ADBBK2GiT+4yJYdzb7KXYvfMY wVQFq8ELUUa08NfjT2IEe0Q2MTifITLM4wTA8fliF5/9tRoLkuqEFmRay uBhJlDOH3fYxfAs/9TThOh/NJW4shbY5MdnCvSez3ebwz7ndULPCAHMbZ w==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236213" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="246236213" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:18:04 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="520617598" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:18:01 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 13/19] soundwire: stream: group sdw_stream_ functions Date: Wed, 26 Jan 2022 09:17:09 +0800 Message-Id: <20220126011715.28204-14-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart Group all exported functions prior to split of add in alloc/config stages necessary for support of multiple calls to hw_params() by ALSA/ASoC core. Pure code move, no functionality change. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 529 +++++++++++++++++++------------------ 1 file changed, 265 insertions(+), 264 deletions(-) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index b7ccfa5a9cfc..b0f21f2ca599 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -1015,45 +1015,6 @@ static int sdw_master_port_config(struct sdw_master_= runtime *m_rt, return 0; } =20 -/** - * sdw_release_stream() - Free the assigned stream runtime - * - * @stream: SoundWire stream runtime - * - * sdw_release_stream should be called only once per stream - */ -void sdw_release_stream(struct sdw_stream_runtime *stream) -{ - kfree(stream); -} -EXPORT_SYMBOL(sdw_release_stream); - -/** - * sdw_alloc_stream() - Allocate and return stream runtime - * - * @stream_name: SoundWire stream name - * - * Allocates a SoundWire stream runtime instance. - * sdw_alloc_stream should be called only once per stream. Typically - * invoked from ALSA/ASoC machine/platform driver. - */ -struct sdw_stream_runtime *sdw_alloc_stream(const char *stream_name) -{ - struct sdw_stream_runtime *stream; - - stream =3D kzalloc(sizeof(*stream), GFP_KERNEL); - if (!stream) - return NULL; - - stream->name =3D stream_name; - INIT_LIST_HEAD(&stream->master_list); - stream->state =3D SDW_STREAM_ALLOCATED; - stream->m_rt_count =3D 0; - - return stream; -} -EXPORT_SYMBOL(sdw_alloc_stream); - /** * sdw_slave_rt_alloc() - Allocate a Slave runtime handle. * @@ -1210,62 +1171,6 @@ static void sdw_release_master_stream(struct sdw_mas= ter_runtime *m_rt, kfree(m_rt); } =20 -/** - * sdw_stream_remove_master() - Remove master from sdw_stream - * - * @bus: SDW Bus instance - * @stream: SoundWire stream - * - * This removes and frees port_rt and master_rt from a stream - */ -int sdw_stream_remove_master(struct sdw_bus *bus, - struct sdw_stream_runtime *stream) -{ - struct sdw_master_runtime *m_rt, *_m_rt; - - mutex_lock(&bus->bus_lock); - - list_for_each_entry_safe(m_rt, _m_rt, - &stream->master_list, stream_node) { - if (m_rt->bus !=3D bus) - continue; - - sdw_master_port_free(m_rt); - sdw_release_master_stream(m_rt, stream); - stream->m_rt_count--; - } - - if (list_empty(&stream->master_list)) - stream->state =3D SDW_STREAM_RELEASED; - - mutex_unlock(&bus->bus_lock); - - return 0; -} -EXPORT_SYMBOL(sdw_stream_remove_master); - -/** - * sdw_stream_remove_slave() - Remove slave from sdw_stream - * - * @slave: SDW Slave instance - * @stream: SoundWire stream - * - * This removes and frees port_rt and slave_rt from a stream - */ -int sdw_stream_remove_slave(struct sdw_slave *slave, - struct sdw_stream_runtime *stream) -{ - mutex_lock(&slave->bus->bus_lock); - - sdw_slave_port_free(slave, stream); - sdw_release_slave_stream(slave, stream); - - mutex_unlock(&slave->bus->bus_lock); - - return 0; -} -EXPORT_SYMBOL(sdw_stream_remove_slave); - /** * sdw_config_stream() - Configure the allocated stream * @@ -1312,175 +1217,6 @@ static int sdw_config_stream(struct device *dev, return 0; } =20 -/** - * sdw_stream_add_master() - Allocate and add master runtime to a stream - * - * @bus: SDW Bus instance - * @stream_config: Stream configuration for audio stream - * @port_config: Port configuration for audio stream - * @num_ports: Number of ports - * @stream: SoundWire stream - */ -int sdw_stream_add_master(struct sdw_bus *bus, - struct sdw_stream_config *stream_config, - struct sdw_port_config *port_config, - unsigned int num_ports, - struct sdw_stream_runtime *stream) -{ - struct sdw_master_runtime *m_rt; - int ret; - - mutex_lock(&bus->bus_lock); - - /* - * For multi link streams, add the second master only if - * the bus supports it. - * Check if bus->multi_link is set - */ - if (!bus->multi_link && stream->m_rt_count > 0) { - dev_err(bus->dev, - "Multilink not supported, link %d\n", bus->link_id); - ret =3D -EINVAL; - goto unlock; - } - - /* - * check if Master is already allocated (e.g. as a result of Slave adding - * it first), if so skip allocation and go to configuration - */ - m_rt =3D sdw_master_rt_find(bus, stream); - if (m_rt) - goto skip_alloc_master_rt; - - m_rt =3D sdw_master_rt_alloc(bus, stream); - if (!m_rt) { - dev_err(bus->dev, "Master runtime alloc failed for stream:%s\n", stream-= >name); - ret =3D -ENOMEM; - goto unlock; - } - - ret =3D sdw_master_rt_config(m_rt, stream_config); - if (ret < 0) - goto unlock; - -skip_alloc_master_rt: - ret =3D sdw_config_stream(bus->dev, stream, stream_config, false); - if (ret) - goto stream_error; - - ret =3D sdw_master_port_alloc(m_rt, num_ports); - if (ret) - goto stream_error; - - ret =3D sdw_master_port_config(m_rt, port_config); - if (ret) - goto stream_error; - - stream->m_rt_count++; - - goto unlock; - -stream_error: - sdw_release_master_stream(m_rt, stream); -unlock: - mutex_unlock(&bus->bus_lock); - return ret; -} -EXPORT_SYMBOL(sdw_stream_add_master); - -/** - * sdw_stream_add_slave() - Allocate and add master/slave runtime to a str= eam - * - * @slave: SDW Slave instance - * @stream_config: Stream configuration for audio stream - * @stream: SoundWire stream - * @port_config: Port configuration for audio stream - * @num_ports: Number of ports - * - * It is expected that Slave is added before adding Master - * to the Stream. - * - */ -int sdw_stream_add_slave(struct sdw_slave *slave, - struct sdw_stream_config *stream_config, - struct sdw_port_config *port_config, - unsigned int num_ports, - struct sdw_stream_runtime *stream) -{ - struct sdw_slave_runtime *s_rt; - struct sdw_master_runtime *m_rt; - int ret; - - mutex_lock(&slave->bus->bus_lock); - - /* - * check if Master is already allocated, if so skip allocation - * and go to configuration - */ - m_rt =3D sdw_master_rt_find(slave->bus, stream); - if (m_rt) - goto skip_alloc_master_rt; - - /* - * If this API is invoked by Slave first then m_rt is not valid. - * So, allocate m_rt and add Slave to it. - */ - m_rt =3D sdw_master_rt_alloc(slave->bus, stream); - if (!m_rt) { - dev_err(&slave->dev, "Master runtime alloc failed for stream:%s\n", stre= am->name); - ret =3D -ENOMEM; - goto error; - } - ret =3D sdw_master_rt_config(m_rt, stream_config); - if (ret < 0) - goto stream_error; - -skip_alloc_master_rt: - s_rt =3D sdw_slave_rt_alloc(slave); - if (!s_rt) { - dev_err(&slave->dev, "Slave runtime alloc failed for stream:%s\n", strea= m->name); - ret =3D -ENOMEM; - goto stream_error; - } - list_add_tail(&s_rt->m_rt_node, &m_rt->slave_rt_list); - - ret =3D sdw_slave_rt_config(s_rt, stream_config); - if (ret) - goto stream_error; - - ret =3D sdw_config_stream(&slave->dev, stream, stream_config, true); - if (ret) - goto stream_error; - - ret =3D sdw_slave_port_alloc(slave, s_rt, num_ports); - if (ret) - goto stream_error; - - ret =3D sdw_slave_port_config(slave, s_rt, port_config); - if (ret) - goto stream_error; - - /* - * Change stream state to CONFIGURED on first Slave add. - * Bus is not aware of number of Slave(s) in a stream at this - * point so cannot depend on all Slave(s) to be added in order to - * change stream state to CONFIGURED. - */ - stream->state =3D SDW_STREAM_CONFIGURED; - goto error; - -stream_error: - /* - * we hit error so cleanup the stream, release all Slave(s) and - * Master runtime - */ - sdw_release_master_stream(m_rt, stream); -error: - mutex_unlock(&slave->bus->bus_lock); - return ret; -} -EXPORT_SYMBOL(sdw_stream_add_slave); - /** * sdw_get_slave_dpn_prop() - Get Slave port capabilities * @@ -1939,6 +1675,32 @@ static int set_stream(struct snd_pcm_substream *subs= tream, return ret; } =20 +/** + * sdw_alloc_stream() - Allocate and return stream runtime + * + * @stream_name: SoundWire stream name + * + * Allocates a SoundWire stream runtime instance. + * sdw_alloc_stream should be called only once per stream. Typically + * invoked from ALSA/ASoC machine/platform driver. + */ +struct sdw_stream_runtime *sdw_alloc_stream(const char *stream_name) +{ + struct sdw_stream_runtime *stream; + + stream =3D kzalloc(sizeof(*stream), GFP_KERNEL); + if (!stream) + return NULL; + + stream->name =3D stream_name; + INIT_LIST_HEAD(&stream->master_list); + stream->state =3D SDW_STREAM_ALLOCATED; + stream->m_rt_count =3D 0; + + return stream; +} +EXPORT_SYMBOL(sdw_alloc_stream); + /** * sdw_startup_stream() - Startup SoundWire stream * @@ -2015,3 +1777,242 @@ void sdw_shutdown_stream(void *sdw_substream) set_stream(substream, NULL); } EXPORT_SYMBOL(sdw_shutdown_stream); + +/** + * sdw_release_stream() - Free the assigned stream runtime + * + * @stream: SoundWire stream runtime + * + * sdw_release_stream should be called only once per stream + */ +void sdw_release_stream(struct sdw_stream_runtime *stream) +{ + kfree(stream); +} +EXPORT_SYMBOL(sdw_release_stream); + +/** + * sdw_stream_add_master() - Allocate and add master runtime to a stream + * + * @bus: SDW Bus instance + * @stream_config: Stream configuration for audio stream + * @port_config: Port configuration for audio stream + * @num_ports: Number of ports + * @stream: SoundWire stream + */ +int sdw_stream_add_master(struct sdw_bus *bus, + struct sdw_stream_config *stream_config, + struct sdw_port_config *port_config, + unsigned int num_ports, + struct sdw_stream_runtime *stream) +{ + struct sdw_master_runtime *m_rt; + int ret; + + mutex_lock(&bus->bus_lock); + + /* + * For multi link streams, add the second master only if + * the bus supports it. + * Check if bus->multi_link is set + */ + if (!bus->multi_link && stream->m_rt_count > 0) { + dev_err(bus->dev, + "Multilink not supported, link %d\n", bus->link_id); + ret =3D -EINVAL; + goto unlock; + } + + /* + * check if Master is already allocated (e.g. as a result of Slave adding + * it first), if so skip allocation and go to configuration + */ + m_rt =3D sdw_master_rt_find(bus, stream); + if (m_rt) + goto skip_alloc_master_rt; + + m_rt =3D sdw_master_rt_alloc(bus, stream); + if (!m_rt) { + dev_err(bus->dev, "Master runtime alloc failed for stream:%s\n", stream-= >name); + ret =3D -ENOMEM; + goto unlock; + } + + ret =3D sdw_master_rt_config(m_rt, stream_config); + if (ret < 0) + goto unlock; + +skip_alloc_master_rt: + ret =3D sdw_config_stream(bus->dev, stream, stream_config, false); + if (ret) + goto stream_error; + + ret =3D sdw_master_port_alloc(m_rt, num_ports); + if (ret) + goto stream_error; + + ret =3D sdw_master_port_config(m_rt, port_config); + if (ret) + goto stream_error; + + stream->m_rt_count++; + + goto unlock; + +stream_error: + sdw_release_master_stream(m_rt, stream); +unlock: + mutex_unlock(&bus->bus_lock); + return ret; +} +EXPORT_SYMBOL(sdw_stream_add_master); + +/** + * sdw_stream_remove_master() - Remove master from sdw_stream + * + * @bus: SDW Bus instance + * @stream: SoundWire stream + * + * This removes and frees port_rt and master_rt from a stream + */ +int sdw_stream_remove_master(struct sdw_bus *bus, + struct sdw_stream_runtime *stream) +{ + struct sdw_master_runtime *m_rt, *_m_rt; + + mutex_lock(&bus->bus_lock); + + list_for_each_entry_safe(m_rt, _m_rt, + &stream->master_list, stream_node) { + if (m_rt->bus !=3D bus) + continue; + + sdw_master_port_free(m_rt); + sdw_release_master_stream(m_rt, stream); + stream->m_rt_count--; + } + + if (list_empty(&stream->master_list)) + stream->state =3D SDW_STREAM_RELEASED; + + mutex_unlock(&bus->bus_lock); + + return 0; +} +EXPORT_SYMBOL(sdw_stream_remove_master); + +/** + * sdw_stream_add_slave() - Allocate and add master/slave runtime to a str= eam + * + * @slave: SDW Slave instance + * @stream_config: Stream configuration for audio stream + * @stream: SoundWire stream + * @port_config: Port configuration for audio stream + * @num_ports: Number of ports + * + * It is expected that Slave is added before adding Master + * to the Stream. + * + */ +int sdw_stream_add_slave(struct sdw_slave *slave, + struct sdw_stream_config *stream_config, + struct sdw_port_config *port_config, + unsigned int num_ports, + struct sdw_stream_runtime *stream) +{ + struct sdw_slave_runtime *s_rt; + struct sdw_master_runtime *m_rt; + int ret; + + mutex_lock(&slave->bus->bus_lock); + + /* + * check if Master is already allocated, if so skip allocation + * and go to configuration + */ + m_rt =3D sdw_master_rt_find(slave->bus, stream); + if (m_rt) + goto skip_alloc_master_rt; + + /* + * If this API is invoked by Slave first then m_rt is not valid. + * So, allocate m_rt and add Slave to it. + */ + m_rt =3D sdw_master_rt_alloc(slave->bus, stream); + if (!m_rt) { + dev_err(&slave->dev, "Master runtime alloc failed for stream:%s\n", stre= am->name); + ret =3D -ENOMEM; + goto error; + } + ret =3D sdw_master_rt_config(m_rt, stream_config); + if (ret < 0) + goto stream_error; + +skip_alloc_master_rt: + s_rt =3D sdw_slave_rt_alloc(slave); + if (!s_rt) { + dev_err(&slave->dev, "Slave runtime alloc failed for stream:%s\n", strea= m->name); + ret =3D -ENOMEM; + goto stream_error; + } + list_add_tail(&s_rt->m_rt_node, &m_rt->slave_rt_list); + + ret =3D sdw_slave_rt_config(s_rt, stream_config); + if (ret) + goto stream_error; + + ret =3D sdw_config_stream(&slave->dev, stream, stream_config, true); + if (ret) + goto stream_error; + + ret =3D sdw_slave_port_alloc(slave, s_rt, num_ports); + if (ret) + goto stream_error; + + ret =3D sdw_slave_port_config(slave, s_rt, port_config); + if (ret) + goto stream_error; + + /* + * Change stream state to CONFIGURED on first Slave add. + * Bus is not aware of number of Slave(s) in a stream at this + * point so cannot depend on all Slave(s) to be added in order to + * change stream state to CONFIGURED. + */ + stream->state =3D SDW_STREAM_CONFIGURED; + goto error; + +stream_error: + /* + * we hit error so cleanup the stream, release all Slave(s) and + * Master runtime + */ + sdw_release_master_stream(m_rt, stream); +error: + mutex_unlock(&slave->bus->bus_lock); + return ret; +} +EXPORT_SYMBOL(sdw_stream_add_slave); + +/** + * sdw_stream_remove_slave() - Remove slave from sdw_stream + * + * @slave: SDW Slave instance + * @stream: SoundWire stream + * + * This removes and frees port_rt and slave_rt from a stream + */ +int sdw_stream_remove_slave(struct sdw_slave *slave, + struct sdw_stream_runtime *stream) +{ + mutex_lock(&slave->bus->bus_lock); + + sdw_slave_port_free(slave, stream); + sdw_release_slave_stream(slave, stream); + + mutex_unlock(&slave->bus->bus_lock); + + return 0; +} +EXPORT_SYMBOL(sdw_stream_remove_slave); + --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 AE2DCC5AC75 for ; Wed, 26 Jan 2022 01:18:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235673AbiAZBSS (ORCPT ); Tue, 25 Jan 2022 20:18:18 -0500 Received: from mga09.intel.com ([134.134.136.24]:5200 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235758AbiAZBSH (ORCPT ); Tue, 25 Jan 2022 20:18:07 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159887; x=1674695887; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=b59jTAE/DjKDRknOz4w/Dz0RG6Sqxw3hnLnDkfdbU/4=; b=Lpr0kNKrZOK5E1ES2zS3XffEic64W47WBBf4TbZsCuMvFOtt0kfMcNFz idctONwlleHThUFJarAC29O7xNB4P3kvR7bCsGHsT2zK4g3Gww3r1aMmV boTm/OnkTAOZf+gCCLEBnoeXoCjwJaNAPswJ1rsdPI/4yk+BPaApFP/T3 O06YZdMIAlElURFumoT6VYHehCWkUUn8yahaCELIwvPkNEoCBQURkQC0A wR8VKU8LIXjzD1H9psz1hUBNln6Lhlgn6AJetpelXe/NY6xrL5niOkizj 3mHpOyUJ6FOKcNHwsdQOs75P1eKD5fAOifKas+YQuxkfHwVIZt9SGLjzD w==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236219" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208,217";a="246236219" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:18:06 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208,217";a="520617617" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:18:04 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 14/19] soundwire: stream: rename and move master/slave_rt_free routines Date: Wed, 26 Jan 2022 09:17:10 +0800 Message-Id: <20220126011715.28204-15-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart The naming is rather inconsistent, use the sdw__ convention, and move the free routine after alloc/config. No functionality change beyond rename/move. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 72 +++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index b0f21f2ca599..e57920ee4c55 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -1054,6 +1054,33 @@ static int sdw_slave_rt_config(struct sdw_slave_runt= ime *s_rt, return 0; } =20 +/** + * sdw_slave_rt_free() - Free Slave(s) runtime handle + * + * @slave: Slave handle. + * @stream: Stream runtime handle. + * + * This function is to be called with bus_lock held. + */ +static void sdw_slave_rt_free(struct sdw_slave *slave, + struct sdw_stream_runtime *stream) +{ + struct sdw_slave_runtime *s_rt, *_s_rt; + struct sdw_master_runtime *m_rt; + + list_for_each_entry(m_rt, &stream->master_list, stream_node) { + /* Retrieve Slave runtime handle */ + list_for_each_entry_safe(s_rt, _s_rt, + &m_rt->slave_rt_list, m_rt_node) { + if (s_rt->slave =3D=3D slave) { + list_del(&s_rt->m_rt_node); + kfree(s_rt); + return; + } + } + } +} + static struct sdw_master_runtime *sdw_master_rt_find(struct sdw_bus *bus, struct sdw_stream_runtime *stream) @@ -1119,51 +1146,24 @@ static int sdw_master_rt_config(struct sdw_master_r= untime *m_rt, } =20 /** - * sdw_release_slave_stream() - Free Slave(s) runtime handle - * - * @slave: Slave handle. - * @stream: Stream runtime handle. - * - * This function is to be called with bus_lock held. - */ -static void sdw_release_slave_stream(struct sdw_slave *slave, - struct sdw_stream_runtime *stream) -{ - struct sdw_slave_runtime *s_rt, *_s_rt; - struct sdw_master_runtime *m_rt; - - list_for_each_entry(m_rt, &stream->master_list, stream_node) { - /* Retrieve Slave runtime handle */ - list_for_each_entry_safe(s_rt, _s_rt, - &m_rt->slave_rt_list, m_rt_node) { - if (s_rt->slave =3D=3D slave) { - list_del(&s_rt->m_rt_node); - kfree(s_rt); - return; - } - } - } -} - -/** - * sdw_release_master_stream() - Free Master runtime handle + * sdw_master_rt_free() - Free Master runtime handle * * @m_rt: Master runtime node * @stream: Stream runtime handle. * * This function is to be called with bus_lock held * It frees the Master runtime handle and associated Slave(s) runtime - * handle. If this is called first then sdw_release_slave_stream() will ha= ve + * handle. If this is called first then sdw_slave_rt_free() will have * no effect as Slave(s) runtime handle would already be freed up. */ -static void sdw_release_master_stream(struct sdw_master_runtime *m_rt, - struct sdw_stream_runtime *stream) +static void sdw_master_rt_free(struct sdw_master_runtime *m_rt, + struct sdw_stream_runtime *stream) { struct sdw_slave_runtime *s_rt, *_s_rt; =20 list_for_each_entry_safe(s_rt, _s_rt, &m_rt->slave_rt_list, m_rt_node) { sdw_slave_port_free(s_rt->slave, stream); - sdw_release_slave_stream(s_rt->slave, stream); + sdw_slave_rt_free(s_rt->slave, stream); } =20 list_del(&m_rt->stream_node); @@ -1860,7 +1860,7 @@ int sdw_stream_add_master(struct sdw_bus *bus, goto unlock; =20 stream_error: - sdw_release_master_stream(m_rt, stream); + sdw_master_rt_free(m_rt, stream); unlock: mutex_unlock(&bus->bus_lock); return ret; @@ -1888,7 +1888,7 @@ int sdw_stream_remove_master(struct sdw_bus *bus, continue; =20 sdw_master_port_free(m_rt); - sdw_release_master_stream(m_rt, stream); + sdw_master_rt_free(m_rt, stream); stream->m_rt_count--; } =20 @@ -1987,7 +1987,7 @@ int sdw_stream_add_slave(struct sdw_slave *slave, * we hit error so cleanup the stream, release all Slave(s) and * Master runtime */ - sdw_release_master_stream(m_rt, stream); + sdw_master_rt_free(m_rt, stream); error: mutex_unlock(&slave->bus->bus_lock); return ret; @@ -2008,7 +2008,7 @@ int sdw_stream_remove_slave(struct sdw_slave *slave, mutex_lock(&slave->bus->bus_lock); =20 sdw_slave_port_free(slave, stream); - sdw_release_slave_stream(slave, stream); + sdw_slave_rt_free(slave, stream); =20 mutex_unlock(&slave->bus->bus_lock); =20 --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 16019C3525A for ; Wed, 26 Jan 2022 01:18:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235880AbiAZBSb (ORCPT ); Tue, 25 Jan 2022 20:18:31 -0500 Received: from mga09.intel.com ([134.134.136.24]:5209 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235765AbiAZBSM (ORCPT ); Tue, 25 Jan 2022 20:18:12 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159892; x=1674695892; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=L3Rs5jIAORH1Ru0BztTzuyiSSChTf9LFA+0AV67sWM4=; b=QJMI28nuWUyago36lz7/VcghAHz1mTG63gkR4wB+SHiCPX7HG5a0dCdn Nv27X3AhNASia9yY6y7dNrsKgfdC7WBqg0Zsz78CQ54Ovw570oIqYSs+L dovTTJvPsGLmtWjzXwplDkRyt0YQ8NL9UUY2Bt1yKRzHgOqYfjgHVhIbd z0AWz8ViF1vzT8hHC3c8Ioz7NozvpiVDhxq/ZgHtJ0nKJBT7wnAN/GdJD Be3sXVpJE4x5WakroEKmFUUjCqfU+laacgQ8GtdRaC+mu+nDyRLRHDcJ2 JLJAOPBy+NV6EfSd4GPIRPZlrogGgyOcWh4qevEtLi9po1dC/i/acAHcU Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236225" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="246236225" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:18:09 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="520617637" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:18:06 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 15/19] soundwire: stream: move list addition to sdw_slave_alloc_rt() Date: Wed, 26 Jan 2022 09:17:11 +0800 Message-Id: <20220126011715.28204-16-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart Simplify sdw_stream_add_slave() by moving the linked list management inside of the sdw_slave_alloc_rt_free() helper, this also makes the alloc/free helpers more symmetrical. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index e57920ee4c55..8a76d6605f93 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -1019,11 +1019,13 @@ static int sdw_master_port_config(struct sdw_master= _runtime *m_rt, * sdw_slave_rt_alloc() - Allocate a Slave runtime handle. * * @slave: Slave handle + * @m_rt: Master runtime handle * * This function is to be called with bus_lock held. */ static struct sdw_slave_runtime -*sdw_slave_rt_alloc(struct sdw_slave *slave) +*sdw_slave_rt_alloc(struct sdw_slave *slave, + struct sdw_master_runtime *m_rt) { struct sdw_slave_runtime *s_rt; =20 @@ -1034,6 +1036,8 @@ static struct sdw_slave_runtime INIT_LIST_HEAD(&s_rt->port_list); s_rt->slave =3D slave; =20 + list_add_tail(&s_rt->m_rt_node, &m_rt->slave_rt_list); + return s_rt; } =20 @@ -1949,13 +1953,12 @@ int sdw_stream_add_slave(struct sdw_slave *slave, goto stream_error; =20 skip_alloc_master_rt: - s_rt =3D sdw_slave_rt_alloc(slave); + s_rt =3D sdw_slave_rt_alloc(slave, m_rt); if (!s_rt) { dev_err(&slave->dev, "Slave runtime alloc failed for stream:%s\n", strea= m->name); ret =3D -ENOMEM; goto stream_error; } - list_add_tail(&s_rt->m_rt_node, &m_rt->slave_rt_list); =20 ret =3D sdw_slave_rt_config(s_rt, stream_config); if (ret) --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 622B4C5AC75 for ; Wed, 26 Jan 2022 01:18:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235813AbiAZBSg (ORCPT ); Tue, 25 Jan 2022 20:18:36 -0500 Received: from mga09.intel.com ([134.134.136.24]:5200 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235744AbiAZBSS (ORCPT ); Tue, 25 Jan 2022 20:18:18 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159898; x=1674695898; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=3uhG1F2z4hDlx2mEu52GZg62Yh8eL4mwJdp5JqpLoI8=; b=ciCC/zk3h3iMLlpZYHXAn37k56lPUPwfzk+dYgFncxgbwGsi+K0hx5ZM 2xUru3rSBCoOIUy8cWCw5CldsUx5zfYb2Yhyhl6rbxdVDf4fwj7ZFSqTB av/pnoWKEzSUACwqkTacDS+LXxKaf+bL9cHn5G1cK3VGkDiFTYlBx9tAA BgEFhfkStyClZRiQeick1dJlfnofeLw9WC+ywI3+PwjTDCFUgIVt9lW3u QjRfvOTAsvlIJRV7I3yD9mutED9JqPBYznZADXVAvEoWriq7DtHP8YxkD nfPz53nwSs3ltNWUAnts5CF4v21f093Hdusj52lVSi7bxg4jn8Ne484Dv A==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236233" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="246236233" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:18:11 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="520617648" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:18:09 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 16/19] soundwire: stream: separate alloc and config within sdw_stream_add_xxx() Date: Wed, 26 Jan 2022 09:17:12 +0800 Message-Id: <20220126011715.28204-17-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart Separate alloc and config parts so that follow-up patches can allow for multiple calls to sdw_stream_add_slave/master. This is a feature from the ALSA/ASoC frameworks which is not supported today. This is an invasive patch which modifies the error handling flow, with cleanups only done when an allocation fails. Configuration failures only return an error code. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 81 ++++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 33 deletions(-) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index 8a76d6605f93..03cfac0129af 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -1811,6 +1811,7 @@ int sdw_stream_add_master(struct sdw_bus *bus, struct sdw_stream_runtime *stream) { struct sdw_master_runtime *m_rt; + bool alloc_master_rt =3D true; int ret; =20 mutex_lock(&bus->bus_lock); @@ -1832,8 +1833,10 @@ int sdw_stream_add_master(struct sdw_bus *bus, * it first), if so skip allocation and go to configuration */ m_rt =3D sdw_master_rt_find(bus, stream); - if (m_rt) + if (m_rt) { + alloc_master_rt =3D false; goto skip_alloc_master_rt; + } =20 m_rt =3D sdw_master_rt_alloc(bus, stream); if (!m_rt) { @@ -1841,30 +1844,32 @@ int sdw_stream_add_master(struct sdw_bus *bus, ret =3D -ENOMEM; goto unlock; } +skip_alloc_master_rt: + + ret =3D sdw_master_port_alloc(m_rt, num_ports); + if (ret) + goto alloc_error; + + stream->m_rt_count++; =20 ret =3D sdw_master_rt_config(m_rt, stream_config); if (ret < 0) goto unlock; =20 -skip_alloc_master_rt: ret =3D sdw_config_stream(bus->dev, stream, stream_config, false); if (ret) - goto stream_error; - - ret =3D sdw_master_port_alloc(m_rt, num_ports); - if (ret) - goto stream_error; + goto unlock; =20 ret =3D sdw_master_port_config(m_rt, port_config); - if (ret) - goto stream_error; - - stream->m_rt_count++; =20 goto unlock; =20 -stream_error: - sdw_master_rt_free(m_rt, stream); +alloc_error: + /* + * we only cleanup what was allocated in this routine + */ + if (alloc_master_rt) + sdw_master_rt_free(m_rt, stream); unlock: mutex_unlock(&bus->bus_lock); return ret; @@ -1926,6 +1931,9 @@ int sdw_stream_add_slave(struct sdw_slave *slave, { struct sdw_slave_runtime *s_rt; struct sdw_master_runtime *m_rt; + bool alloc_master_rt =3D true; + bool alloc_slave_rt =3D true; + int ret; =20 mutex_lock(&slave->bus->bus_lock); @@ -1935,8 +1943,10 @@ int sdw_stream_add_slave(struct sdw_slave *slave, * and go to configuration */ m_rt =3D sdw_master_rt_find(slave->bus, stream); - if (m_rt) + if (m_rt) { + alloc_master_rt =3D false; goto skip_alloc_master_rt; + } =20 /* * If this API is invoked by Slave first then m_rt is not valid. @@ -1946,35 +1956,37 @@ int sdw_stream_add_slave(struct sdw_slave *slave, if (!m_rt) { dev_err(&slave->dev, "Master runtime alloc failed for stream:%s\n", stre= am->name); ret =3D -ENOMEM; - goto error; + goto unlock; } - ret =3D sdw_master_rt_config(m_rt, stream_config); - if (ret < 0) - goto stream_error; =20 skip_alloc_master_rt: s_rt =3D sdw_slave_rt_alloc(slave, m_rt); if (!s_rt) { dev_err(&slave->dev, "Slave runtime alloc failed for stream:%s\n", strea= m->name); + alloc_slave_rt =3D false; ret =3D -ENOMEM; - goto stream_error; + goto alloc_error; } =20 + ret =3D sdw_slave_port_alloc(slave, s_rt, num_ports); + if (ret) + goto alloc_error; + + ret =3D sdw_master_rt_config(m_rt, stream_config); + if (ret) + goto unlock; + ret =3D sdw_slave_rt_config(s_rt, stream_config); if (ret) - goto stream_error; + goto unlock; =20 ret =3D sdw_config_stream(&slave->dev, stream, stream_config, true); if (ret) - goto stream_error; - - ret =3D sdw_slave_port_alloc(slave, s_rt, num_ports); - if (ret) - goto stream_error; + goto unlock; =20 ret =3D sdw_slave_port_config(slave, s_rt, port_config); if (ret) - goto stream_error; + goto unlock; =20 /* * Change stream state to CONFIGURED on first Slave add. @@ -1983,15 +1995,19 @@ int sdw_stream_add_slave(struct sdw_slave *slave, * change stream state to CONFIGURED. */ stream->state =3D SDW_STREAM_CONFIGURED; - goto error; + goto unlock; =20 -stream_error: +alloc_error: /* - * we hit error so cleanup the stream, release all Slave(s) and - * Master runtime + * we only cleanup what was allocated in this routine. The 'else if' + * is intentional, the 'master_rt_free' will call sdw_slave_rt_free() + * internally. */ - sdw_master_rt_free(m_rt, stream); -error: + if (alloc_master_rt) + sdw_master_rt_free(m_rt, stream); + else if (alloc_slave_rt) + sdw_slave_rt_free(slave, stream); +unlock: mutex_unlock(&slave->bus->bus_lock); return ret; } @@ -2018,4 +2034,3 @@ int sdw_stream_remove_slave(struct sdw_slave *slave, return 0; } EXPORT_SYMBOL(sdw_stream_remove_slave); - --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 57B2CC5AC75 for ; Wed, 26 Jan 2022 01:18:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235786AbiAZBSl (ORCPT ); Tue, 25 Jan 2022 20:18:41 -0500 Received: from mga09.intel.com ([134.134.136.24]:5224 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235874AbiAZBSb (ORCPT ); Tue, 25 Jan 2022 20:18:31 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159911; x=1674695911; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=HqwmM8cFsKV+ilXjUfiKlQwCHphq3jNKilfDG+AYRhU=; b=NJGi1DUMhSipnFyA1V5qklw6vLRCIlIu6+gfzth194lJrCreTWcTTCp+ Qvg2qw1BV0pzMYaBbxMXCXw5y6Q+s63e7h7EFAE2m+JVphMJnYQIWU86n zkYWs9PjDISnQHDI2fuG8I8B1lz4CRrcVWWhcpQUaK4MDaiEtKkRh/+60 r8weOB8D3WSif39306zYsY4Us15z8pt+LakUshiipzAvooDzTHhIOxea7 YtPXn+rf1kvFRBE+4NgAzGgvdI551EfJo53D1Bd8iWEf5QBiX8mzYn9Eu EChzLMK49z0f6G1WC4pJ/sIIjhcxWNZ+dEwELkYPjO5GTgvSLCThXTSu7 Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236246" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="246236246" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:18:14 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="520617654" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:18:11 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 17/19] soundwire: stream: introduce sdw_slave_rt_find() helper Date: Wed, 26 Jan 2022 09:17:13 +0800 Message-Id: <20220126011715.28204-18-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart Before we split the alloc and config steps, we need a helper to find the Slave runtime for a stream. The helper is based on the search loop in sdw_slave_rt_free(), which can now be simplified. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index 03cfac0129af..a52a9ab0eea1 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -1058,6 +1058,23 @@ static int sdw_slave_rt_config(struct sdw_slave_runt= ime *s_rt, return 0; } =20 +static struct sdw_slave_runtime *sdw_slave_rt_find(struct sdw_slave *slave, + struct sdw_stream_runtime *stream) +{ + struct sdw_slave_runtime *s_rt, *_s_rt; + struct sdw_master_runtime *m_rt; + + list_for_each_entry(m_rt, &stream->master_list, stream_node) { + /* Retrieve Slave runtime handle */ + list_for_each_entry_safe(s_rt, _s_rt, + &m_rt->slave_rt_list, m_rt_node) { + if (s_rt->slave =3D=3D slave) + return s_rt; + } + } + return NULL; +} + /** * sdw_slave_rt_free() - Free Slave(s) runtime handle * @@ -1069,19 +1086,12 @@ static int sdw_slave_rt_config(struct sdw_slave_run= time *s_rt, static void sdw_slave_rt_free(struct sdw_slave *slave, struct sdw_stream_runtime *stream) { - struct sdw_slave_runtime *s_rt, *_s_rt; - struct sdw_master_runtime *m_rt; + struct sdw_slave_runtime *s_rt; =20 - list_for_each_entry(m_rt, &stream->master_list, stream_node) { - /* Retrieve Slave runtime handle */ - list_for_each_entry_safe(s_rt, _s_rt, - &m_rt->slave_rt_list, m_rt_node) { - if (s_rt->slave =3D=3D slave) { - list_del(&s_rt->m_rt_node); - kfree(s_rt); - return; - } - } + s_rt =3D sdw_slave_rt_find(slave, stream); + if (s_rt) { + list_del(&s_rt->m_rt_node); + kfree(s_rt); } } =20 --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 5C88BC3525A for ; Wed, 26 Jan 2022 01:18:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235817AbiAZBSp (ORCPT ); Tue, 25 Jan 2022 20:18:45 -0500 Received: from mga09.intel.com ([134.134.136.24]:5209 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235637AbiAZBSc (ORCPT ); Tue, 25 Jan 2022 20:18:32 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159912; x=1674695912; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=tEU3JXFvTcLnvhlyRCwxkBFoGoHR5/y8RfltTRrDs3Q=; b=HEZZH0+LfgArjavSBXTCRQwg/7WyV6xIbrovAACY7ZQKvP84bCfM0TQI 0pZ1AkfIInUwvgLDXEWypBEkZuUF5wqQvwivA7WYnqJP4ZZeSu2gQ7Sry wWg34jSquk9rs4ntzKhv/WUBJ42EV0/Ky/0w6W47Xh794Ku850OR8PpJx YG3ylZwYdoYGdRMM2npUuDMHB8KlkuEXKikuz09xi7v2tCXGRgRJiTzfS 9F8beNkXjaqH0Qyw1ttMAKypXcjgRtERB6ea8hNK33mgBGTEZHLWw7QYf 3WilNvb5GNlimKEKiYJd0FGVGH02gtya0s0nxEiOtBy3bb15Wmlb0kh1k Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236250" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="246236250" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:18:16 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="520617661" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:18:14 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 18/19] soundwire: stream: sdw_stream_add_ functions can be called multiple times Date: Wed, 26 Jan 2022 09:17:14 +0800 Message-Id: <20220126011715.28204-19-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart The sdw_stream_add_slave/master() functions are called from the .hw_params stage. We need to make sure the functions can be called multiple times. In this version, we assume that only 'audio' parameters provide in the hw_params() can change. If the number of ports could change dynamically depending on the stream configuration (number of channels, etc), we would need to free-up all the stream resources and reallocate them. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index a52a9ab0eea1..ccf3c99dd579 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -898,6 +898,11 @@ static void sdw_port_free(struct sdw_port_runtime *p_r= t) kfree(p_rt); } =20 +static bool sdw_slave_port_allocated(struct sdw_slave_runtime *s_rt) +{ + return !list_empty(&s_rt->port_list); +} + static void sdw_slave_port_free(struct sdw_slave *slave, struct sdw_stream_runtime *stream) { @@ -972,6 +977,11 @@ static int sdw_slave_port_config(struct sdw_slave *sla= ve, return 0; } =20 +static bool sdw_master_port_allocated(struct sdw_master_runtime *m_rt) +{ + return !list_empty(&m_rt->port_list); +} + static void sdw_master_port_free(struct sdw_master_runtime *m_rt) { struct sdw_port_runtime *p_rt, *_p_rt; @@ -1856,12 +1866,17 @@ int sdw_stream_add_master(struct sdw_bus *bus, } skip_alloc_master_rt: =20 + if (sdw_master_port_allocated(m_rt)) + goto skip_alloc_master_port; + ret =3D sdw_master_port_alloc(m_rt, num_ports); if (ret) goto alloc_error; =20 stream->m_rt_count++; =20 +skip_alloc_master_port: + ret =3D sdw_master_rt_config(m_rt, stream_config); if (ret < 0) goto unlock; @@ -1970,6 +1985,10 @@ int sdw_stream_add_slave(struct sdw_slave *slave, } =20 skip_alloc_master_rt: + s_rt =3D sdw_slave_rt_find(slave, stream); + if (s_rt) + goto skip_alloc_slave_rt; + s_rt =3D sdw_slave_rt_alloc(slave, m_rt); if (!s_rt) { dev_err(&slave->dev, "Slave runtime alloc failed for stream:%s\n", strea= m->name); @@ -1978,10 +1997,15 @@ int sdw_stream_add_slave(struct sdw_slave *slave, goto alloc_error; } =20 +skip_alloc_slave_rt: + if (sdw_slave_port_allocated(s_rt)) + goto skip_port_alloc; + ret =3D sdw_slave_port_alloc(slave, s_rt, num_ports); if (ret) goto alloc_error; =20 +skip_port_alloc: ret =3D sdw_master_rt_config(m_rt, stream_config); if (ret) goto unlock; --=20 2.17.1 From nobody Tue Jun 30 03:39:06 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 57D61C3525A for ; Wed, 26 Jan 2022 01:18:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235777AbiAZBSs (ORCPT ); Tue, 25 Jan 2022 20:18:48 -0500 Received: from mga09.intel.com ([134.134.136.24]:5200 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235684AbiAZBSd (ORCPT ); Tue, 25 Jan 2022 20:18:33 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643159913; x=1674695913; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=h64EeMv4yhUSNqyVY599nfi6XpGRNHkuBvZCeGF55d8=; b=NPzItKG/LzWjiIuvBLphYQORhZtQDdXNGjvcFIIEKE7rsg2oe+tV/UNv KPNnaq1bzliY2F/4y9HDK9ThGI8tL5eMCMrYmm3nI7+/A2FXac49WPcqh 4hZkPtrFSiNRGsapTVy6UtqKqN4ZqJ2E/1DP/3A81tZdU3Ayj966wiJkD b0ymhLLxxMAXpfmDFv3AWZe509PXBZPWSrTU44E1jYrI40tld/FJPi1cX sjZvapeYtnotfPQKB1fkxa3C0jYXRV7hS6HpPFqbalmtW88vZ6ExLm97Z c4p7GPOBzUfW891IaTIceXgP/95MKPmh6XogsZNRi+20Klk5CCxQETIh5 g==; X-IronPort-AV: E=McAfee;i="6200,9189,10238"; a="246236256" X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="246236256" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:18:18 -0800 X-IronPort-AV: E=Sophos;i="5.88,316,1635231600"; d="scan'208";a="520617680" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 17:18:16 -0800 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org, srinivas.kandagatla@linaro.org, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, bard.liao@intel.com Subject: [PATCH 19/19] soundwire: stream: make enable/disable/deprepare idempotent Date: Wed, 26 Jan 2022 09:17:15 +0800 Message-Id: <20220126011715.28204-20-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> References: <20220126011715.28204-1-yung-chuan.liao@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart The stream management currently flags an 'inconsistent state' error when a change is requested multiple times. This was added on purpose to identify programming mistakes. In hindsight, there was no real reason to fail if the logic at the ASoC-DPCM level invokes the same callback multiple times. It's perfectly acceptable to just return and not flag an error when there is nothing to do. The main concern with the state management is to trap errors such as trying to enable a stream that was not prepared first. This patch suggests allowing the stream functions to be idempotent, i.e. they can be called multiple times. Note that the prepare case was already handling multiple calls, this was added in commit c32464c9393d ("soundwire: stream: only prepare stream when it is configured.") Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/stream.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c index ccf3c99dd579..f273459b2023 100644 --- a/drivers/soundwire/stream.c +++ b/drivers/soundwire/stream.c @@ -1505,6 +1505,11 @@ int sdw_enable_stream(struct sdw_stream_runtime *str= eam) =20 sdw_acquire_bus_lock(stream); =20 + if (stream->state =3D=3D SDW_STREAM_ENABLED) { + ret =3D 0; + goto state_err; + } + if (stream->state !=3D SDW_STREAM_PREPARED && stream->state !=3D SDW_STREAM_DISABLED) { pr_err("%s: %s: inconsistent state state %d\n", @@ -1588,6 +1593,11 @@ int sdw_disable_stream(struct sdw_stream_runtime *st= ream) =20 sdw_acquire_bus_lock(stream); =20 + if (stream->state =3D=3D SDW_STREAM_DISABLED) { + ret =3D 0; + goto state_err; + } + if (stream->state !=3D SDW_STREAM_ENABLED) { pr_err("%s: %s: inconsistent state state %d\n", __func__, stream->name, stream->state); @@ -1663,6 +1673,11 @@ int sdw_deprepare_stream(struct sdw_stream_runtime *= stream) =20 sdw_acquire_bus_lock(stream); =20 + if (stream->state =3D=3D SDW_STREAM_DEPREPARED) { + ret =3D 0; + goto state_err; + } + if (stream->state !=3D SDW_STREAM_PREPARED && stream->state !=3D SDW_STREAM_DISABLED) { pr_err("%s: %s: inconsistent state state %d\n", --=20 2.17.1