From nobody Thu Apr 2 22:58:05 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 A8CA3ECAAA1 for ; Mon, 19 Sep 2022 17:50:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231206AbiISRut (ORCPT ); Mon, 19 Sep 2022 13:50:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37724 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230337AbiISRuo (ORCPT ); Mon, 19 Sep 2022 13:50:44 -0400 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5D8A241D1F for ; Mon, 19 Sep 2022 10:50:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1663609843; x=1695145843; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=kR8qyX1wDq4ckI2iLTSjTnUv5thwS03UGveFT81cs5I=; b=bV+SLyPSR2LJTDZWaNdmkipzaxSXi5Wkv5/hRxzrA+ufNMRVhuxPNwrz ihcoB9005zZlqqiGUr3lT/dtOIu4Crify0VROGTfqtPMxT5ACiPEZ0AOP Fuk4jVs4Kdu7QzeGNbd9EiGyhiPkRMSem1ji42JD9vooeQ7MqFbdjlpRY aXWFVPCCYnFHlBGR5RzMHqVIzrFYJTHnz58dsj/Hrw1sUJLyc22lpgb0J NbWjWW7jVE4p4cc5EyNg1bfk8KBAWBrsEo9wXfQQIV1x5dQXUJismi4k4 LanL09zwjK/LoLza4jc8kaiLLzVq/zGT6QR8nmh/PD+JQgmqIP+RIFvcj g==; X-IronPort-AV: E=McAfee;i="6500,9779,10475"; a="363429124" X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="363429124" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:42 -0700 X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="863658371" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:41 -0700 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, bard.liao@intel.com Subject: [PATCH 01/11] soundwire: intel: fix error handling on dai registration issues Date: Tue, 20 Sep 2022 01:57:11 +0800 Message-Id: <20220919175721.354679-2-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> References: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart The call to intel_register_dai() may fail because of memory allocation issues or problems reported by the ASoC core. In all cases, when a error is thrown the component is not registered, it's invalid to unregister it. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/intel.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c index 01be62fa6c83..3bb29bc00d5a 100644 --- a/drivers/soundwire/intel.c +++ b/drivers/soundwire/intel.c @@ -1432,7 +1432,6 @@ int intel_link_startup(struct auxiliary_device *auxde= v) ret =3D intel_register_dai(sdw); if (ret) { dev_err(dev, "DAI registration failed: %d\n", ret); - snd_soc_unregister_component(dev); goto err_interrupt; } =20 --=20 2.25.1 From nobody Thu Apr 2 22:58:05 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 1116DECAAA1 for ; Mon, 19 Sep 2022 17:50:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231296AbiISRux (ORCPT ); Mon, 19 Sep 2022 13:50:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37822 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230459AbiISRur (ORCPT ); Mon, 19 Sep 2022 13:50:47 -0400 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E515A42AC8 for ; Mon, 19 Sep 2022 10:50:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1663609845; x=1695145845; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=EviRt9EmxI1oqeLj/2924DDSte2Z0gsI2mryQ9QkDl4=; b=Y7QKyuIwhFv5JfIa+78U5DgjrKTMLYSBnMO3CQ042sRGPKQeLlshrtA8 UXDDloR/g03S917HwViM4/IOFPig9YI2yOZi2kFkSLojyY8xVZujA+SCa RKoa+cAJVj9lWS0SWTz7Ec5jdEJlOAKWU11+X1Z3gISlndmIDpq6LoVs1 IBxePurWcQ92AuzgOdmhPpd7BMa/0nQbyh6q0L+sZj5ShyFJEwjv9V5od G4ct9XiypDyI1EYcpAFppBLbGc8GB/x9QQyNYtU2cyaYGTl5soz9QpKJ4 bxT/Gv0oUtlEE9qQN/n08P9Rl3o7+MahUxjBxUEU8Xc5igWcwcBpk89eL g==; X-IronPort-AV: E=McAfee;i="6500,9779,10475"; a="363429156" X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="363429156" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:44 -0700 X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="863658384" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:43 -0700 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, bard.liao@intel.com Subject: [PATCH 02/11] soundwire: intel: simplify flow and use devm_ for DAI registration Date: Tue, 20 Sep 2022 01:57:12 +0800 Message-Id: <20220919175721.354679-3-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> References: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart We already use devm_ for memory allocation but not for component/DAI registration. The resource management can be based on devm_ in all cases. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/intel.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c index 3bb29bc00d5a..a6fe91f2d964 100644 --- a/drivers/soundwire/intel.c +++ b/drivers/soundwire/intel.c @@ -1203,8 +1203,8 @@ static int intel_register_dai(struct sdw_intel *sdw) if (ret) return ret; =20 - return snd_soc_register_component(cdns->dev, &dai_component, - dais, num_dai); + return devm_snd_soc_register_component(cdns->dev, &dai_component, + dais, num_dai); } =20 static int sdw_master_read_intel_prop(struct sdw_bus *bus) @@ -1489,7 +1489,6 @@ int intel_link_startup(struct auxiliary_device *auxde= v) =20 static void intel_link_remove(struct auxiliary_device *auxdev) { - struct device *dev =3D &auxdev->dev; struct sdw_cdns *cdns =3D auxiliary_get_drvdata(auxdev); struct sdw_intel *sdw =3D cdns_to_intel(cdns); struct sdw_bus *bus =3D &cdns->bus; @@ -1502,7 +1501,6 @@ static void intel_link_remove(struct auxiliary_device= *auxdev) if (!bus->prop.hw_disabled) { intel_debugfs_exit(sdw); sdw_cdns_enable_interrupt(cdns, false); - snd_soc_unregister_component(dev); } sdw_bus_master_delete(bus); } --=20 2.25.1 From nobody Thu Apr 2 22:58:05 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 99002ECAAD3 for ; Mon, 19 Sep 2022 17:50:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231328AbiISRu5 (ORCPT ); Mon, 19 Sep 2022 13:50:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37866 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230483AbiISRus (ORCPT ); Mon, 19 Sep 2022 13:50:48 -0400 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C004440BFB for ; Mon, 19 Sep 2022 10:50:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1663609847; x=1695145847; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=grC3JO/QhhKE8hi6QZ/jj64Nuz3BhMdMj/nvoJJ91hs=; b=cRIB5KToQWybokugm+xBquyReA5OuNQo+Sn2w4mleYe8XYZgP/Ywdxn3 SrNJYwMUvrr4lGZ9pagoBkQG0uaVZgA1aSuzxhxlFpnKpU1DOPyOGI32G qF0D228zFEp/R0BpjBRWgIsXPHwz9JUYdjDJvIdfrtmwP+OqdVyW5CrXZ qxT+Tu0upUMmzV1iu4WWe//BScSxIxZJHxixhBwSXyRg6MC4WMxgf73d3 x49UzSPT5l1rKQWRAbvicMNGVVhI09pU9Xufrz80bA6RTyGwRu2+r9/w+ jtOYK/ZBZyTSN0OgMOML0FnJSnjoiO2oN+QAnZQyLUScIVHYi+3L0mVtT Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10475"; a="363429185" X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="363429185" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:46 -0700 X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="863658388" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:44 -0700 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, bard.liao@intel.com Subject: [PATCH 03/11] soundwire: intel: move DAI registration and debugfs init earlier Date: Tue, 20 Sep 2022 01:57:13 +0800 Message-Id: <20220919175721.354679-4-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> References: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart These two steps can and should be done before starting up the clock and the bus operation. This is a first step before re-grouping functionality in well-defined callbacks. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/intel.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c index a6fe91f2d964..d7852cc7dd96 100644 --- a/drivers/soundwire/intel.c +++ b/drivers/soundwire/intel.c @@ -1393,6 +1393,15 @@ int intel_link_startup(struct auxiliary_device *auxd= ev) =20 intel_pdi_ch_update(sdw); =20 + /* Register DAIs */ + ret =3D intel_register_dai(sdw); + if (ret) { + dev_err(dev, "DAI registration failed: %d\n", ret); + goto err_init; + } + + intel_debugfs_init(sdw); + ret =3D sdw_cdns_enable_interrupt(cdns, true); if (ret < 0) { dev_err(dev, "cannot enable interrupts\n"); @@ -1428,15 +1437,6 @@ int intel_link_startup(struct auxiliary_device *auxd= ev) sdw_cdns_check_self_clearing_bits(cdns, __func__, true, INTEL_MASTER_RESET_ITERATIONS); =20 - /* Register DAIs */ - ret =3D intel_register_dai(sdw); - if (ret) { - dev_err(dev, "DAI registration failed: %d\n", ret); - goto err_interrupt; - } - - intel_debugfs_init(sdw); - /* Enable runtime PM */ if (!(link_flags & SDW_INTEL_MASTER_DISABLE_PM_RUNTIME)) { pm_runtime_set_autosuspend_delay(dev, --=20 2.25.1 From nobody Thu Apr 2 22:58:05 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 BD913ECAAA1 for ; Mon, 19 Sep 2022 17:51:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231386AbiISRvA (ORCPT ); Mon, 19 Sep 2022 13:51:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37944 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230477AbiISRuu (ORCPT ); Mon, 19 Sep 2022 13:50:50 -0400 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id ADE5B402F8 for ; Mon, 19 Sep 2022 10:50:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1663609849; x=1695145849; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=QdddNi3xNXTqW9R7OXfPq7qq+hZkkcHfGOJFzY4TwbA=; b=FHKPe7YXGMQ3pNihe9Wtr6m0CF288rwfMN9jxR19bLvysuv9QLun4tnb oKf2pJIEKxYgIb1J1eBBiPzjPceK6Zt7iAgwMv3U/VaKGifmUVda4uF7x R+g5qUkvRELZ16VNCs+5TVzdxRVJVQMuHNC4IqEGZPDGZOHl51r+uewlN vlbQm5c7NdNWGMIRnvDSuNgYpyZIU+QicQOaFaSuvNqkBzyhqtYEDbqOR Yk6yKlE24X8BxVS+XlEWV/Lp6J2L/hDq76XpoyGFTdKvZ/NcX3DJcUqST rjTue6tsOvGitZjTvaWdkzdE0ExsbDJQJgrahi/xnVNt7104LFed14M/H A==; X-IronPort-AV: E=McAfee;i="6500,9779,10475"; a="363429205" X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="363429205" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:48 -0700 X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="863658402" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:46 -0700 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, bard.liao@intel.com Subject: [PATCH 04/11] soundwire: intel: move all PDI initialization under intel_register_dai() Date: Tue, 20 Sep 2022 01:57:14 +0800 Message-Id: <20220919175721.354679-5-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> References: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart Start regrouping functionality in high-level functions. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/intel.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c index d7852cc7dd96..676de04c5070 100644 --- a/drivers/soundwire/intel.c +++ b/drivers/soundwire/intel.c @@ -1171,11 +1171,20 @@ static int intel_create_dai(struct sdw_cdns *cdns, =20 static int intel_register_dai(struct sdw_intel *sdw) { + struct sdw_cdns_stream_config config; struct sdw_cdns *cdns =3D &sdw->cdns; struct sdw_cdns_streams *stream; struct snd_soc_dai_driver *dais; int num_dai, ret, off =3D 0; =20 + /* Read the PDI config and initialize cadence PDI */ + intel_pdi_init(sdw, &config); + ret =3D sdw_cdns_pdi_init(cdns, config); + if (ret) + return ret; + + intel_pdi_ch_update(sdw); + /* DAIs are created based on total number of PDIs supported */ num_dai =3D cdns->pcm.num_pdi; =20 @@ -1347,7 +1356,6 @@ static int intel_link_probe(struct auxiliary_device *= auxdev, =20 int intel_link_startup(struct auxiliary_device *auxdev) { - struct sdw_cdns_stream_config config; struct device *dev =3D &auxdev->dev; struct sdw_cdns *cdns =3D auxiliary_get_drvdata(auxdev); struct sdw_intel *sdw =3D cdns_to_intel(cdns); @@ -1385,14 +1393,6 @@ int intel_link_startup(struct auxiliary_device *auxd= ev) if (ret) goto err_init; =20 - /* Read the PDI config and initialize cadence PDI */ - intel_pdi_init(sdw, &config); - ret =3D sdw_cdns_pdi_init(cdns, config); - if (ret) - goto err_init; - - intel_pdi_ch_update(sdw); - /* Register DAIs */ ret =3D intel_register_dai(sdw); if (ret) { --=20 2.25.1 From nobody Thu Apr 2 22:58:05 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 B849DECAAD3 for ; Mon, 19 Sep 2022 17:51:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231390AbiISRvE (ORCPT ); Mon, 19 Sep 2022 13:51:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37952 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230337AbiISRuv (ORCPT ); Mon, 19 Sep 2022 13:50:51 -0400 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AC995422D1 for ; Mon, 19 Sep 2022 10:50:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1663609850; x=1695145850; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ysMlpOvB+Aq5Jze0gGbEnYMmySseBub88xxP7dnnXTo=; b=ZR6zPfM1GJJ0XoMEnFi9zgopQm6mBsgW41lilxk+eVEQJSPoIFzdminR CltkHIGKxkobTIGNHYqgSJN1NMBA+egFP8wBEMcyMLNUwOxi659eS3meN IBO9fFqf/Cu5tBPUqaYPWsmNCrZS2f5eSa6c5v+yFPVrXHudKoMOwqN5V 1tsApRFMIJxzrsbC2iHL+LSxgn/e/Tx/KBGaY5w0jete/2T/GB6ClMFdb hA89tYrsIDXZae5NfyiUJ1zCIfbHhblJUQtuIVQkwoPH0c1wNrP2D5rlF oaenYJBMEbPlymZzQC4RLMBbh1DhbxkR3O8cXkedEzT6oYIIXgRYAs8L6 Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10475"; a="363429233" X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="363429233" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:50 -0700 X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="863658427" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:48 -0700 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, bard.liao@intel.com Subject: [PATCH 05/11] soundwire: intel: remove clock_stop parameter in intel_shim_init() Date: Tue, 20 Sep 2022 01:57:15 +0800 Message-Id: <20220919175721.354679-6-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> References: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart Simplify signature before further code reshuffling. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/intel.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c index 676de04c5070..2d828d98e153 100644 --- a/drivers/soundwire/intel.c +++ b/drivers/soundwire/intel.c @@ -391,7 +391,7 @@ static void intel_shim_master_ip_to_glue(struct sdw_int= el *sdw) /* at this point Integration Glue has full control of the I/Os */ } =20 -static int intel_shim_init(struct sdw_intel *sdw, bool clock_stop) +static int intel_shim_init(struct sdw_intel *sdw) { void __iomem *shim =3D sdw->link_res->shim; unsigned int link_id =3D sdw->instance; @@ -1277,14 +1277,10 @@ static struct sdw_master_ops sdw_intel_ops =3D { =20 static int intel_init(struct sdw_intel *sdw) { - bool clock_stop; - /* Initialize shim and controller */ intel_link_power_up(sdw); =20 - clock_stop =3D sdw_cdns_is_clock_stop(&sdw->cdns); - - intel_shim_init(sdw, clock_stop); + intel_shim_init(sdw); =20 return 0; } --=20 2.25.1 From nobody Thu Apr 2 22:58:05 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 E986BECAAD3 for ; Mon, 19 Sep 2022 17:51:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231280AbiISRvM (ORCPT ); Mon, 19 Sep 2022 13:51:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38010 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231356AbiISRu6 (ORCPT ); Mon, 19 Sep 2022 13:50:58 -0400 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A9CD343620 for ; Mon, 19 Sep 2022 10:50:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1663609853; x=1695145853; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=5FyW8xBbXeJkum8aRiIIbDtkh2gfMubt0it9/PXMLG8=; b=JK5jexsSo27EZ3OXGaC7S+Eq7tRdIk63PBJw21NcCGRYm9sP3ZY9Aqsn w8iwfrE0OdZ0NdeicTkhHSndfHXlqvYtK/3zRMMLSN654zGF2Uvzkbst0 EzvgAcfL0+pD/7XUHLKmYNwo9e3d1DOuURzpXaVnHk7iRsjjMNylp5KbF iBxQA+CiEvTHO8Qksf33mQWkeXF7edlzhF4iJTKzg1mQ098vTHoVs0ajU Au63qfjaXcjkXKPfgr43/mv7ChiKBnoWvqRN9RLKboy3q9Gha7sD1v7a7 O6hUVTDSnv6hITPa2ZqJSiayrgAsCbVPg7TfrUMWf/fh1sH8p9Cm9BLcK g==; X-IronPort-AV: E=McAfee;i="6500,9779,10475"; a="363429261" X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="363429261" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:52 -0700 X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="863658448" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:50 -0700 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, bard.liao@intel.com Subject: [PATCH 06/11] soundwire: intel: move shim initialization before power up/down Date: Tue, 20 Sep 2022 01:57:16 +0800 Message-Id: <20220919175721.354679-7-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> References: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart Move code around before additional simplification. No functionality change. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/intel.c | 231 +++++++++++++++++++------------------- 1 file changed, 115 insertions(+), 116 deletions(-) diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c index 2d828d98e153..140cf36eb407 100644 --- a/drivers/soundwire/intel.c +++ b/drivers/soundwire/intel.c @@ -260,6 +260,121 @@ static void intel_debugfs_exit(struct sdw_intel *sdw)= {} /* * shim ops */ +/* this needs to be called with shim_lock */ +static void intel_shim_glue_to_master_ip(struct sdw_intel *sdw) +{ + void __iomem *shim =3D sdw->link_res->shim; + unsigned int link_id =3D sdw->instance; + u16 ioctl; + + /* Switch to MIP from Glue logic */ + ioctl =3D intel_readw(shim, SDW_SHIM_IOCTL(link_id)); + + ioctl &=3D ~(SDW_SHIM_IOCTL_DOE); + intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); + usleep_range(10, 15); + + ioctl &=3D ~(SDW_SHIM_IOCTL_DO); + intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); + usleep_range(10, 15); + + ioctl |=3D (SDW_SHIM_IOCTL_MIF); + intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); + usleep_range(10, 15); + + ioctl &=3D ~(SDW_SHIM_IOCTL_BKE); + ioctl &=3D ~(SDW_SHIM_IOCTL_COE); + intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); + usleep_range(10, 15); + + /* at this point Master IP has full control of the I/Os */ +} + +/* this needs to be called with shim_lock */ +static void intel_shim_master_ip_to_glue(struct sdw_intel *sdw) +{ + unsigned int link_id =3D sdw->instance; + void __iomem *shim =3D sdw->link_res->shim; + u16 ioctl; + + /* Glue logic */ + ioctl =3D intel_readw(shim, SDW_SHIM_IOCTL(link_id)); + ioctl |=3D SDW_SHIM_IOCTL_BKE; + ioctl |=3D SDW_SHIM_IOCTL_COE; + intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); + usleep_range(10, 15); + + ioctl &=3D ~(SDW_SHIM_IOCTL_MIF); + intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); + usleep_range(10, 15); + + /* at this point Integration Glue has full control of the I/Os */ +} + +static int intel_shim_init(struct sdw_intel *sdw) +{ + void __iomem *shim =3D sdw->link_res->shim; + unsigned int link_id =3D sdw->instance; + int ret =3D 0; + u16 ioctl =3D 0, act =3D 0; + + mutex_lock(sdw->link_res->shim_lock); + + /* Initialize Shim */ + ioctl |=3D SDW_SHIM_IOCTL_BKE; + intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); + usleep_range(10, 15); + + ioctl |=3D SDW_SHIM_IOCTL_WPDD; + intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); + usleep_range(10, 15); + + ioctl |=3D SDW_SHIM_IOCTL_DO; + intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); + usleep_range(10, 15); + + ioctl |=3D SDW_SHIM_IOCTL_DOE; + intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); + usleep_range(10, 15); + + intel_shim_glue_to_master_ip(sdw); + + u16p_replace_bits(&act, 0x1, SDW_SHIM_CTMCTL_DOAIS); + act |=3D SDW_SHIM_CTMCTL_DACTQE; + act |=3D SDW_SHIM_CTMCTL_DODS; + intel_writew(shim, SDW_SHIM_CTMCTL(link_id), act); + usleep_range(10, 15); + + mutex_unlock(sdw->link_res->shim_lock); + + return ret; +} + +static void intel_shim_wake(struct sdw_intel *sdw, bool wake_enable) +{ + void __iomem *shim =3D sdw->link_res->shim; + unsigned int link_id =3D sdw->instance; + u16 wake_en, wake_sts; + + mutex_lock(sdw->link_res->shim_lock); + wake_en =3D intel_readw(shim, SDW_SHIM_WAKEEN); + + if (wake_enable) { + /* Enable the wakeup */ + wake_en |=3D (SDW_SHIM_WAKEEN_ENABLE << link_id); + intel_writew(shim, SDW_SHIM_WAKEEN, wake_en); + } else { + /* Disable the wake up interrupt */ + wake_en &=3D ~(SDW_SHIM_WAKEEN_ENABLE << link_id); + intel_writew(shim, SDW_SHIM_WAKEEN, wake_en); + + /* Clear wake status */ + wake_sts =3D intel_readw(shim, SDW_SHIM_WAKESTS); + wake_sts |=3D (SDW_SHIM_WAKESTS_STATUS << link_id); + intel_writew(shim, SDW_SHIM_WAKESTS, wake_sts); + } + mutex_unlock(sdw->link_res->shim_lock); +} =20 static int intel_link_power_up(struct sdw_intel *sdw) { @@ -340,122 +455,6 @@ static int intel_link_power_up(struct sdw_intel *sdw) return ret; } =20 -/* this needs to be called with shim_lock */ -static void intel_shim_glue_to_master_ip(struct sdw_intel *sdw) -{ - void __iomem *shim =3D sdw->link_res->shim; - unsigned int link_id =3D sdw->instance; - u16 ioctl; - - /* Switch to MIP from Glue logic */ - ioctl =3D intel_readw(shim, SDW_SHIM_IOCTL(link_id)); - - ioctl &=3D ~(SDW_SHIM_IOCTL_DOE); - intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); - usleep_range(10, 15); - - ioctl &=3D ~(SDW_SHIM_IOCTL_DO); - intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); - usleep_range(10, 15); - - ioctl |=3D (SDW_SHIM_IOCTL_MIF); - intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); - usleep_range(10, 15); - - ioctl &=3D ~(SDW_SHIM_IOCTL_BKE); - ioctl &=3D ~(SDW_SHIM_IOCTL_COE); - intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); - usleep_range(10, 15); - - /* at this point Master IP has full control of the I/Os */ -} - -/* this needs to be called with shim_lock */ -static void intel_shim_master_ip_to_glue(struct sdw_intel *sdw) -{ - unsigned int link_id =3D sdw->instance; - void __iomem *shim =3D sdw->link_res->shim; - u16 ioctl; - - /* Glue logic */ - ioctl =3D intel_readw(shim, SDW_SHIM_IOCTL(link_id)); - ioctl |=3D SDW_SHIM_IOCTL_BKE; - ioctl |=3D SDW_SHIM_IOCTL_COE; - intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); - usleep_range(10, 15); - - ioctl &=3D ~(SDW_SHIM_IOCTL_MIF); - intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); - usleep_range(10, 15); - - /* at this point Integration Glue has full control of the I/Os */ -} - -static int intel_shim_init(struct sdw_intel *sdw) -{ - void __iomem *shim =3D sdw->link_res->shim; - unsigned int link_id =3D sdw->instance; - int ret =3D 0; - u16 ioctl =3D 0, act =3D 0; - - mutex_lock(sdw->link_res->shim_lock); - - /* Initialize Shim */ - ioctl |=3D SDW_SHIM_IOCTL_BKE; - intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); - usleep_range(10, 15); - - ioctl |=3D SDW_SHIM_IOCTL_WPDD; - intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); - usleep_range(10, 15); - - ioctl |=3D SDW_SHIM_IOCTL_DO; - intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); - usleep_range(10, 15); - - ioctl |=3D SDW_SHIM_IOCTL_DOE; - intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); - usleep_range(10, 15); - - intel_shim_glue_to_master_ip(sdw); - - u16p_replace_bits(&act, 0x1, SDW_SHIM_CTMCTL_DOAIS); - act |=3D SDW_SHIM_CTMCTL_DACTQE; - act |=3D SDW_SHIM_CTMCTL_DODS; - intel_writew(shim, SDW_SHIM_CTMCTL(link_id), act); - usleep_range(10, 15); - - mutex_unlock(sdw->link_res->shim_lock); - - return ret; -} - -static void intel_shim_wake(struct sdw_intel *sdw, bool wake_enable) -{ - void __iomem *shim =3D sdw->link_res->shim; - unsigned int link_id =3D sdw->instance; - u16 wake_en, wake_sts; - - mutex_lock(sdw->link_res->shim_lock); - wake_en =3D intel_readw(shim, SDW_SHIM_WAKEEN); - - if (wake_enable) { - /* Enable the wakeup */ - wake_en |=3D (SDW_SHIM_WAKEEN_ENABLE << link_id); - intel_writew(shim, SDW_SHIM_WAKEEN, wake_en); - } else { - /* Disable the wake up interrupt */ - wake_en &=3D ~(SDW_SHIM_WAKEEN_ENABLE << link_id); - intel_writew(shim, SDW_SHIM_WAKEEN, wake_en); - - /* Clear wake status */ - wake_sts =3D intel_readw(shim, SDW_SHIM_WAKESTS); - wake_sts |=3D (SDW_SHIM_WAKESTS_STATUS << link_id); - intel_writew(shim, SDW_SHIM_WAKESTS, wake_sts); - } - mutex_unlock(sdw->link_res->shim_lock); -} - static int intel_link_power_down(struct sdw_intel *sdw) { u32 link_control, spa_mask, cpa_mask; --=20 2.25.1 From nobody Thu Apr 2 22:58:05 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 69AF4ECAAD3 for ; Mon, 19 Sep 2022 17:51:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231435AbiISRvS (ORCPT ); Mon, 19 Sep 2022 13:51:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38260 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231372AbiISRu7 (ORCPT ); Mon, 19 Sep 2022 13:50:59 -0400 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C97494362B for ; Mon, 19 Sep 2022 10:50:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1663609854; x=1695145854; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=JLrBqsp8Ryp2ISD8I4vo0ddVnpHvol6JNhobDsbmiJ0=; b=PJzWt6NCFKYd2OObsetlx0EbzcMXtHkCM+xlOx0ueW0T1r99BP6G8H7K cw828pewzGprm4Vay9gMD7tACEcli8JXEWMLeWcmF06wpAcWBresig3k0 qDfU3EroEjnyESvFGfOeF3iDvVhN6fDQuUjoTrgZzg3bOwdTJhAwVX/gP SX+GPl9Z9YlPX2DZM897aOE9psTpLZu+GVGaw6PCHjsJXVQVufRHke9xj yBHOAFZ53o78z0Z3OXkYlHlIu+5VXzwoWjcA6ecpYIUs80dOr4GxhCSvy 819Mk0Unxb8TrZdQ8OveS/DyM1+Adi1eqEfDT/gxV1XR+Zsm58c0b7c/a g==; X-IronPort-AV: E=McAfee;i="6500,9779,10475"; a="363429278" X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="363429278" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:53 -0700 X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="863658468" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:52 -0700 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, bard.liao@intel.com Subject: [PATCH 07/11] soundwire: intel: remove intel_init() wrapper Date: Tue, 20 Sep 2022 01:57:17 +0800 Message-Id: <20220919175721.354679-8-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> References: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart We can directly call intel_link_power_up and do power_up+shim_init in the same function. This simplifies the code with a better symmetry between power_up and power_down operations. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/intel.c | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c index 140cf36eb407..4eeb2b5c1594 100644 --- a/drivers/soundwire/intel.c +++ b/drivers/soundwire/intel.c @@ -311,15 +311,13 @@ static void intel_shim_master_ip_to_glue(struct sdw_i= ntel *sdw) /* at this point Integration Glue has full control of the I/Os */ } =20 -static int intel_shim_init(struct sdw_intel *sdw) +/* this needs to be called with shim_lock */ +static void intel_shim_init(struct sdw_intel *sdw) { void __iomem *shim =3D sdw->link_res->shim; unsigned int link_id =3D sdw->instance; - int ret =3D 0; u16 ioctl =3D 0, act =3D 0; =20 - mutex_lock(sdw->link_res->shim_lock); - /* Initialize Shim */ ioctl |=3D SDW_SHIM_IOCTL_BKE; intel_writew(shim, SDW_SHIM_IOCTL(link_id), ioctl); @@ -344,10 +342,6 @@ static int intel_shim_init(struct sdw_intel *sdw) act |=3D SDW_SHIM_CTMCTL_DODS; intel_writew(shim, SDW_SHIM_CTMCTL(link_id), act); usleep_range(10, 15); - - mutex_unlock(sdw->link_res->shim_lock); - - return ret; } =20 static void intel_shim_wake(struct sdw_intel *sdw, bool wake_enable) @@ -449,6 +443,9 @@ static int intel_link_power_up(struct sdw_intel *sdw) *shim_mask |=3D BIT(link_id); =20 sdw->cdns.link_up =3D true; + + intel_shim_init(sdw); + out: mutex_unlock(sdw->link_res->shim_lock); =20 @@ -1274,16 +1271,6 @@ static struct sdw_master_ops sdw_intel_ops =3D { .post_bank_switch =3D intel_post_bank_switch, }; =20 -static int intel_init(struct sdw_intel *sdw) -{ - /* Initialize shim and controller */ - intel_link_power_up(sdw); - - intel_shim_init(sdw); - - return 0; -} - /* * probe and init (aux_dev_id argument is required by function prototype b= ut not used) */ @@ -1384,7 +1371,7 @@ int intel_link_startup(struct auxiliary_device *auxde= v) } =20 /* Initialize shim, controller */ - ret =3D intel_init(sdw); + ret =3D intel_link_power_up(sdw); if (ret) goto err_init; =20 @@ -1773,7 +1760,7 @@ static int __maybe_unused intel_resume(struct device = *dev) pm_runtime_idle(dev); } =20 - ret =3D intel_init(sdw); + ret =3D intel_link_power_up(sdw); if (ret) { dev_err(dev, "%s failed: %d\n", __func__, ret); return ret; @@ -1862,7 +1849,7 @@ static int __maybe_unused intel_resume_runtime(struct= device *dev) clock_stop_quirks =3D sdw->link_res->clock_stop_quirks; =20 if (clock_stop_quirks & SDW_INTEL_CLK_STOP_TEARDOWN) { - ret =3D intel_init(sdw); + ret =3D intel_link_power_up(sdw); if (ret) { dev_err(dev, "%s failed: %d\n", __func__, ret); return ret; @@ -1910,7 +1897,7 @@ static int __maybe_unused intel_resume_runtime(struct= device *dev) true, INTEL_MASTER_RESET_ITERATIONS); =20 } else if (clock_stop_quirks & SDW_INTEL_CLK_STOP_BUS_RESET) { - ret =3D intel_init(sdw); + ret =3D intel_link_power_up(sdw); if (ret) { dev_err(dev, "%s failed: %d\n", __func__, ret); return ret; @@ -1991,7 +1978,7 @@ static int __maybe_unused intel_resume_runtime(struct= device *dev) if (!clock_stop0) dev_err(dev, "%s invalid configuration, clock was not stopped", __func_= _); =20 - ret =3D intel_init(sdw); + ret =3D intel_link_power_up(sdw); if (ret) { dev_err(dev, "%s failed: %d\n", __func__, ret); return ret; --=20 2.25.1 From nobody Thu Apr 2 22:58:05 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 2E59CECAAA1 for ; Mon, 19 Sep 2022 17:51:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231468AbiISRvZ (ORCPT ); Mon, 19 Sep 2022 13:51:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38670 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231397AbiISRvK (ORCPT ); Mon, 19 Sep 2022 13:51:10 -0400 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DB65343E7A for ; Mon, 19 Sep 2022 10:50:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1663609856; x=1695145856; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=OKogfO4K6IMOMgoifEN6M6CT/AXHoyqz1X/Mml5qstY=; b=QvyNn1DSZBhA3/FEEA7XKqWQyKIPfJBfR4U3IxitQ9tFB2cZ270pRXPC BpIPJUzoxMU21uvgHfsWKi1qQPts4hGnpg9DgXtJqq0yJXx8NlLwz6bMU wmpeN7sgUEtnu+Dh9b2Fwuh2h9AAMUszC9aWneKBBgj7xhHClMz+tPB/5 41HsGfxJMsG1/132bg2yq4yw2agiQyIN2A6307dTVDa6w3RF6WpiZNxWl v7eMHnDxkTXCgytYgcbvkm/bYKvffSaXXTJ7nIhlu4sV/pNqGUCebi0hr Ws2ZYK0OzlOJ6ESCDKjSoM63HKSpHahy81P4M3raZBC1nUuqc/x3w23uW w==; X-IronPort-AV: E=McAfee;i="6500,9779,10475"; a="363429295" X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="363429295" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:55 -0700 X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="863658499" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:54 -0700 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, bard.liao@intel.com Subject: [PATCH 08/11] soundwire: intel: simplify read ops assignment Date: Tue, 20 Sep 2022 01:57:18 +0800 Message-Id: <20220919175721.354679-9-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> References: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart We can assign the right callback directly in the ops structure. No functionality change. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/intel.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c index 4eeb2b5c1594..66aab02b9323 100644 --- a/drivers/soundwire/intel.c +++ b/drivers/soundwire/intel.c @@ -1261,7 +1261,7 @@ static int intel_prop_read(struct sdw_bus *bus) } =20 static struct sdw_master_ops sdw_intel_ops =3D { - .read_prop =3D sdw_master_read_prop, + .read_prop =3D intel_prop_read, .override_adr =3D sdw_dmi_override_adr, .xfer_msg =3D cdns_xfer_msg, .xfer_msg_defer =3D cdns_xfer_msg_defer, @@ -1304,8 +1304,7 @@ static int intel_link_probe(struct auxiliary_device *= auxdev, =20 sdw_cdns_probe(cdns); =20 - /* Set property read ops */ - sdw_intel_ops.read_prop =3D intel_prop_read; + /* Set ops */ bus->ops =3D &sdw_intel_ops; =20 /* set driver data, accessed by snd_soc_dai_get_drvdata() */ --=20 2.25.1 From nobody Thu Apr 2 22:58:05 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 5648BECAAA1 for ; Mon, 19 Sep 2022 17:51:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231474AbiISRv3 (ORCPT ); Mon, 19 Sep 2022 13:51:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38032 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231403AbiISRvK (ORCPT ); Mon, 19 Sep 2022 13:51:10 -0400 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0012644556 for ; Mon, 19 Sep 2022 10:50:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1663609858; x=1695145858; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=081EPmTS3y815iiCscPub7rqoLD2JH0w0KdPzW1+ikI=; b=C7RPc5Svqlhk+sS2TI7iLb3HY3u/3nhO243uvBRLyya2QPKefVXS7ZHI gSR7AJXDtk0APlLxV2heqkh1Pg/TPtwInHDmZR9gWGQSo/YXy3nyX7QUr 3Og2uTNZtP1CZ/dhOYVBZGNhY13r4X190I/064DyGULNXG3rpPdtMwj68 xLlJ0p9djA46pLyMVmgIpP3Olzw2ruxCJObRCYnQFRFZ/57fWItuLsMzu fu+1KjjKQNTQqs9Ka2xK2eFdSiVmmh9DITSey2hhCmh2udv7ie/vvlLdO VLKWeIQ9ppJZud/I6JnPGWB/+wnwh6rOqA9SXh6GPGyF2Sep+SqsbNGg+ w==; X-IronPort-AV: E=McAfee;i="6500,9779,10475"; a="363429319" X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="363429319" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:57 -0700 X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="863658548" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:56 -0700 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, bard.liao@intel.com Subject: [PATCH 09/11] soundwire: intel: introduce intel_shim_check_wake() helper Date: Tue, 20 Sep 2022 01:57:19 +0800 Message-Id: <20220919175721.354679-10-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> References: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart Add new helper before code partitioning in order to avoid direct read from specific register. No functionality change. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/intel.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c index 66aab02b9323..2ca924622153 100644 --- a/drivers/soundwire/intel.c +++ b/drivers/soundwire/intel.c @@ -344,6 +344,17 @@ static void intel_shim_init(struct sdw_intel *sdw) usleep_range(10, 15); } =20 +static int intel_shim_check_wake(struct sdw_intel *sdw) +{ + void __iomem *shim; + u16 wake_sts; + + shim =3D sdw->link_res->shim; + wake_sts =3D intel_readw(shim, SDW_SHIM_WAKESTS); + + return wake_sts & BIT(sdw->instance); +} + static void intel_shim_wake(struct sdw_intel *sdw, bool wake_enable) { void __iomem *shim =3D sdw->link_res->shim; @@ -1491,8 +1502,6 @@ int intel_link_process_wakeen_event(struct auxiliary_= device *auxdev) struct device *dev =3D &auxdev->dev; struct sdw_intel *sdw; struct sdw_bus *bus; - void __iomem *shim; - u16 wake_sts; =20 sdw =3D auxiliary_get_drvdata(auxdev); bus =3D &sdw->cdns.bus; @@ -1503,10 +1512,7 @@ int intel_link_process_wakeen_event(struct auxiliary= _device *auxdev) return 0; } =20 - shim =3D sdw->link_res->shim; - wake_sts =3D intel_readw(shim, SDW_SHIM_WAKESTS); - - if (!(wake_sts & BIT(sdw->instance))) + if (!intel_shim_check_wake(sdw)) return 0; =20 /* disable WAKEEN interrupt ASAP to prevent interrupt flood */ --=20 2.25.1 From nobody Thu Apr 2 22:58:05 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 DA4F9ECAAD3 for ; Mon, 19 Sep 2022 17:51:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231451AbiISRvw (ORCPT ); Mon, 19 Sep 2022 13:51:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38810 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231429AbiISRvN (ORCPT ); Mon, 19 Sep 2022 13:51:13 -0400 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A3C7243E62 for ; Mon, 19 Sep 2022 10:51:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1663609860; x=1695145860; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=g9GpV0D8iiL8DS1/b9l/HN2tHUJ93url3w8XnhgEB1k=; b=DbNbq64RbycltJ0mi2Rb3iYhUdrmpkcC9YCcKcxZwq+Kd9oX5Zwo6nEw CLu/3Fv5cSSft4nMxaoxTH+V3uCAGmZ5by/rikTR2RcI1Ym4Y1L4PGBUb WNDhLBGorCK//MjzqnSkQF4v198w+R/s+vTvClxAN85Jly27OK7rZpN0d /KvpTxvDDp9ybl474mdeEPsP1+TnjpyJh6qOVLq6arfZ+KhG+7rv4McRU uHjNlQKnYjiDv7FhiWvNW68JLAzulEx+zNY1RC6KzyHgcivSEtsQS50ne a1SAi9LH2UtRijXjhl+kepbryxS4esVoV893l9CE1RViNORy/OiNmmjMY w==; X-IronPort-AV: E=McAfee;i="6500,9779,10475"; a="363429355" X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="363429355" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:59 -0700 X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="863658612" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:57 -0700 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, bard.liao@intel.com Subject: [PATCH 10/11] soundwire: intel: introduce helpers to start bus Date: Tue, 20 Sep 2022 01:57:20 +0800 Message-Id: <20220919175721.354679-11-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> References: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart There are 3 different sequences to start the bus, let's move the functionality to helpers. There should be no functionality change, except in error cases where the flow is improved with more consistent disabling of interrupts and powering down. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/intel.c | 388 +++++++++++++++++++------------------- 1 file changed, 195 insertions(+), 193 deletions(-) diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c index 2ca924622153..abe14436d874 100644 --- a/drivers/soundwire/intel.c +++ b/drivers/soundwire/intel.c @@ -1223,6 +1223,174 @@ static int intel_register_dai(struct sdw_intel *sdw) dais, num_dai); } =20 +static int intel_start_bus(struct sdw_intel *sdw) +{ + struct device *dev =3D sdw->cdns.dev; + struct sdw_cdns *cdns =3D &sdw->cdns; + struct sdw_bus *bus =3D &cdns->bus; + int ret; + + ret =3D sdw_cdns_enable_interrupt(cdns, true); + if (ret < 0) { + dev_err(dev, "%s: cannot enable interrupts: %d\n", __func__, ret); + return ret; + } + + /* + * follow recommended programming flows to avoid timeouts when + * gsync is enabled + */ + if (bus->multi_link) + intel_shim_sync_arm(sdw); + + ret =3D sdw_cdns_init(cdns); + if (ret < 0) { + dev_err(dev, "%s: unable to initialize Cadence IP: %d\n", __func__, ret); + goto err_interrupt; + } + + ret =3D sdw_cdns_exit_reset(cdns); + if (ret < 0) { + dev_err(dev, "%s: unable to exit bus reset sequence: %d\n", __func__, re= t); + goto err_interrupt; + } + + if (bus->multi_link) { + ret =3D intel_shim_sync_go(sdw); + if (ret < 0) { + dev_err(dev, "%s: sync go failed: %d\n", __func__, ret); + goto err_interrupt; + } + } + sdw_cdns_check_self_clearing_bits(cdns, __func__, + true, INTEL_MASTER_RESET_ITERATIONS); + + return 0; + +err_interrupt: + sdw_cdns_enable_interrupt(cdns, false); + return ret; +} + +static int intel_start_bus_after_reset(struct sdw_intel *sdw) +{ + struct device *dev =3D sdw->cdns.dev; + struct sdw_cdns *cdns =3D &sdw->cdns; + struct sdw_bus *bus =3D &cdns->bus; + bool clock_stop0; + int status; + int ret; + + /* + * An exception condition occurs for the CLK_STOP_BUS_RESET + * case if one or more masters remain active. In this condition, + * all the masters are powered on for they are in the same power + * domain. Master can preserve its context for clock stop0, so + * there is no need to clear slave status and reset bus. + */ + clock_stop0 =3D sdw_cdns_is_clock_stop(&sdw->cdns); + + if (!clock_stop0) { + + /* + * make sure all Slaves are tagged as UNATTACHED and + * provide reason for reinitialization + */ + + status =3D SDW_UNATTACH_REQUEST_MASTER_RESET; + sdw_clear_slave_status(bus, status); + + ret =3D sdw_cdns_enable_interrupt(cdns, true); + if (ret < 0) { + dev_err(dev, "cannot enable interrupts during resume\n"); + return ret; + } + + /* + * follow recommended programming flows to avoid + * timeouts when gsync is enabled + */ + if (bus->multi_link) + intel_shim_sync_arm(sdw); + + /* + * Re-initialize the IP since it was powered-off + */ + sdw_cdns_init(&sdw->cdns); + + } else { + ret =3D sdw_cdns_enable_interrupt(cdns, true); + if (ret < 0) { + dev_err(dev, "cannot enable interrupts during resume\n"); + return ret; + } + } + + ret =3D sdw_cdns_clock_restart(cdns, !clock_stop0); + if (ret < 0) { + dev_err(dev, "unable to restart clock during resume\n"); + goto err_interrupt; + } + + if (!clock_stop0) { + ret =3D sdw_cdns_exit_reset(cdns); + if (ret < 0) { + dev_err(dev, "unable to exit bus reset sequence during resume\n"); + goto err_interrupt; + } + + if (bus->multi_link) { + ret =3D intel_shim_sync_go(sdw); + if (ret < 0) { + dev_err(sdw->cdns.dev, "sync go failed during resume\n"); + goto err_interrupt; + } + } + } + sdw_cdns_check_self_clearing_bits(cdns, __func__, true, INTEL_MASTER_RESE= T_ITERATIONS); + + return 0; + +err_interrupt: + sdw_cdns_enable_interrupt(cdns, false); + return ret; +} + +static void intel_check_clock_stop(struct sdw_intel *sdw) +{ + struct device *dev =3D sdw->cdns.dev; + bool clock_stop0; + + clock_stop0 =3D sdw_cdns_is_clock_stop(&sdw->cdns); + if (!clock_stop0) + dev_err(dev, "%s: invalid configuration, clock was not stopped\n", __fun= c__); +} + +static int intel_start_bus_after_clock_stop(struct sdw_intel *sdw) +{ + struct device *dev =3D sdw->cdns.dev; + struct sdw_cdns *cdns =3D &sdw->cdns; + int ret; + + ret =3D sdw_cdns_enable_interrupt(cdns, true); + if (ret < 0) { + dev_err(dev, "%s: cannot enable interrupts: %d\n", __func__, ret); + return ret; + } + + ret =3D sdw_cdns_clock_restart(cdns, false); + if (ret < 0) { + dev_err(dev, "%s: unable to restart clock: %d\n", __func__, ret); + sdw_cdns_enable_interrupt(cdns, false); + return ret; + } + + sdw_cdns_check_self_clearing_bits(cdns, "intel_resume_runtime no_quirks", + true, INTEL_MASTER_RESET_ITERATIONS); + + return 0; +} + static int sdw_master_read_intel_prop(struct sdw_bus *bus) { struct sdw_master_prop *prop =3D &bus->prop; @@ -1368,7 +1536,6 @@ int intel_link_startup(struct auxiliary_device *auxde= v) multi_link =3D !(link_flags & SDW_INTEL_MASTER_DISABLE_MULTI_LINK); if (!multi_link) { dev_dbg(dev, "Multi-link is disabled\n"); - bus->multi_link =3D false; } else { /* * hardware-based synchronization is required regardless @@ -1376,9 +1543,9 @@ int intel_link_startup(struct auxiliary_device *auxde= v) * synchronization is gated by gsync when the multi-master * mode is set. */ - bus->multi_link =3D true; bus->hw_sync_min_links =3D 1; } + bus->multi_link =3D multi_link; =20 /* Initialize shim, controller */ ret =3D intel_link_power_up(sdw); @@ -1389,46 +1556,18 @@ int intel_link_startup(struct auxiliary_device *aux= dev) ret =3D intel_register_dai(sdw); if (ret) { dev_err(dev, "DAI registration failed: %d\n", ret); - goto err_init; + goto err_power_up; } =20 intel_debugfs_init(sdw); =20 - ret =3D sdw_cdns_enable_interrupt(cdns, true); - if (ret < 0) { - dev_err(dev, "cannot enable interrupts\n"); - goto err_init; + /* start bus */ + ret =3D intel_start_bus(sdw); + if (ret) { + dev_err(dev, "bus start failed: %d\n", ret); + goto err_power_up; } =20 - /* - * follow recommended programming flows to avoid timeouts when - * gsync is enabled - */ - if (multi_link) - intel_shim_sync_arm(sdw); - - ret =3D sdw_cdns_init(cdns); - if (ret < 0) { - dev_err(dev, "unable to initialize Cadence IP\n"); - goto err_interrupt; - } - - ret =3D sdw_cdns_exit_reset(cdns); - if (ret < 0) { - dev_err(dev, "unable to exit bus reset sequence\n"); - goto err_interrupt; - } - - if (multi_link) { - ret =3D intel_shim_sync_go(sdw); - if (ret < 0) { - dev_err(dev, "sync go failed: %d\n", ret); - goto err_interrupt; - } - } - sdw_cdns_check_self_clearing_bits(cdns, __func__, - true, INTEL_MASTER_RESET_ITERATIONS); - /* Enable runtime PM */ if (!(link_flags & SDW_INTEL_MASTER_DISABLE_PM_RUNTIME)) { pm_runtime_set_autosuspend_delay(dev, @@ -1473,8 +1612,8 @@ int intel_link_startup(struct auxiliary_device *auxde= v) sdw->startup_done =3D true; return 0; =20 -err_interrupt: - sdw_cdns_enable_interrupt(cdns, false); +err_power_up: + intel_link_power_down(sdw); err_init: return ret; } @@ -1738,7 +1877,6 @@ static int __maybe_unused intel_resume(struct device = *dev) struct sdw_intel *sdw =3D cdns_to_intel(cdns); struct sdw_bus *bus =3D &cdns->bus; int link_flags; - bool multi_link; int ret; =20 if (bus->prop.hw_disabled || !sdw->startup_done) { @@ -1748,7 +1886,6 @@ static int __maybe_unused intel_resume(struct device = *dev) } =20 link_flags =3D md_flags >> (bus->link_id * 8); - multi_link =3D !(link_flags & SDW_INTEL_MASTER_DISABLE_MULTI_LINK); =20 if (pm_runtime_suspended(dev)) { dev_dbg(dev, "pm_runtime status was suspended, forcing active\n"); @@ -1777,41 +1914,13 @@ static int __maybe_unused intel_resume(struct devic= e *dev) */ sdw_clear_slave_status(bus, SDW_UNATTACH_REQUEST_MASTER_RESET); =20 - ret =3D sdw_cdns_enable_interrupt(cdns, true); + ret =3D intel_start_bus(sdw); if (ret < 0) { - dev_err(dev, "cannot enable interrupts during resume\n"); + dev_err(dev, "cannot start bus during resume\n"); + intel_link_power_down(sdw); return ret; } =20 - /* - * follow recommended programming flows to avoid timeouts when - * gsync is enabled - */ - if (multi_link) - intel_shim_sync_arm(sdw); - - ret =3D sdw_cdns_init(&sdw->cdns); - if (ret < 0) { - dev_err(dev, "unable to initialize Cadence IP during resume\n"); - return ret; - } - - ret =3D sdw_cdns_exit_reset(cdns); - if (ret < 0) { - dev_err(dev, "unable to exit bus reset sequence during resume\n"); - return ret; - } - - if (multi_link) { - ret =3D intel_shim_sync_go(sdw); - if (ret < 0) { - dev_err(dev, "sync go failed during resume\n"); - return ret; - } - } - sdw_cdns_check_self_clearing_bits(cdns, __func__, - true, INTEL_MASTER_RESET_ITERATIONS); - /* * after system resume, the pm_runtime suspend() may kick in * during the enumeration, before any children device force the @@ -1824,7 +1933,7 @@ static int __maybe_unused intel_resume(struct device = *dev) */ pm_runtime_mark_last_busy(dev); =20 - return ret; + return 0; } =20 static int __maybe_unused intel_resume_runtime(struct device *dev) @@ -1833,10 +1942,6 @@ static int __maybe_unused intel_resume_runtime(struc= t device *dev) struct sdw_intel *sdw =3D cdns_to_intel(cdns); struct sdw_bus *bus =3D &cdns->bus; u32 clock_stop_quirks; - bool clock_stop0; - int link_flags; - bool multi_link; - int status; int ret; =20 if (bus->prop.hw_disabled || !sdw->startup_done) { @@ -1848,15 +1953,12 @@ static int __maybe_unused intel_resume_runtime(stru= ct device *dev) /* unconditionally disable WAKEEN interrupt */ intel_shim_wake(sdw, false); =20 - link_flags =3D md_flags >> (bus->link_id * 8); - multi_link =3D !(link_flags & SDW_INTEL_MASTER_DISABLE_MULTI_LINK); - clock_stop_quirks =3D sdw->link_res->clock_stop_quirks; =20 if (clock_stop_quirks & SDW_INTEL_CLK_STOP_TEARDOWN) { ret =3D intel_link_power_up(sdw); if (ret) { - dev_err(dev, "%s failed: %d\n", __func__, ret); + dev_err(dev, "%s: power_up failed after teardown: %d\n", __func__, ret); return ret; } =20 @@ -1866,145 +1968,45 @@ static int __maybe_unused intel_resume_runtime(str= uct device *dev) */ sdw_clear_slave_status(bus, SDW_UNATTACH_REQUEST_MASTER_RESET); =20 - ret =3D sdw_cdns_enable_interrupt(cdns, true); + ret =3D intel_start_bus(sdw); if (ret < 0) { - dev_err(dev, "cannot enable interrupts during resume\n"); + dev_err(dev, "%s: cannot start bus after teardown: %d\n", __func__, ret= ); + intel_link_power_down(sdw); return ret; } =20 - /* - * follow recommended programming flows to avoid - * timeouts when gsync is enabled - */ - if (multi_link) - intel_shim_sync_arm(sdw); - - ret =3D sdw_cdns_init(&sdw->cdns); - if (ret < 0) { - dev_err(dev, "unable to initialize Cadence IP during resume\n"); - return ret; - } - - ret =3D sdw_cdns_exit_reset(cdns); - if (ret < 0) { - dev_err(dev, "unable to exit bus reset sequence during resume\n"); - return ret; - } - - if (multi_link) { - ret =3D intel_shim_sync_go(sdw); - if (ret < 0) { - dev_err(dev, "sync go failed during resume\n"); - return ret; - } - } - sdw_cdns_check_self_clearing_bits(cdns, "intel_resume_runtime TEARDOWN", - true, INTEL_MASTER_RESET_ITERATIONS); =20 } else if (clock_stop_quirks & SDW_INTEL_CLK_STOP_BUS_RESET) { ret =3D intel_link_power_up(sdw); if (ret) { - dev_err(dev, "%s failed: %d\n", __func__, ret); + dev_err(dev, "%s: power_up failed after bus reset: %d\n", __func__, ret= ); return ret; } =20 - /* - * An exception condition occurs for the CLK_STOP_BUS_RESET - * case if one or more masters remain active. In this condition, - * all the masters are powered on for they are in the same power - * domain. Master can preserve its context for clock stop0, so - * there is no need to clear slave status and reset bus. - */ - clock_stop0 =3D sdw_cdns_is_clock_stop(&sdw->cdns); - - if (!clock_stop0) { - - /* - * make sure all Slaves are tagged as UNATTACHED and - * provide reason for reinitialization - */ - - status =3D SDW_UNATTACH_REQUEST_MASTER_RESET; - sdw_clear_slave_status(bus, status); - - ret =3D sdw_cdns_enable_interrupt(cdns, true); - if (ret < 0) { - dev_err(dev, "cannot enable interrupts during resume\n"); - return ret; - } - - /* - * follow recommended programming flows to avoid - * timeouts when gsync is enabled - */ - if (multi_link) - intel_shim_sync_arm(sdw); - - /* - * Re-initialize the IP since it was powered-off - */ - sdw_cdns_init(&sdw->cdns); - - } else { - ret =3D sdw_cdns_enable_interrupt(cdns, true); - if (ret < 0) { - dev_err(dev, "cannot enable interrupts during resume\n"); - return ret; - } - } - - ret =3D sdw_cdns_clock_restart(cdns, !clock_stop0); + ret =3D intel_start_bus_after_reset(sdw); if (ret < 0) { - dev_err(dev, "unable to restart clock during resume\n"); + dev_err(dev, "%s: cannot start bus after reset: %d\n", __func__, ret); + intel_link_power_down(sdw); return ret; } - - if (!clock_stop0) { - ret =3D sdw_cdns_exit_reset(cdns); - if (ret < 0) { - dev_err(dev, "unable to exit bus reset sequence during resume\n"); - return ret; - } - - if (multi_link) { - ret =3D intel_shim_sync_go(sdw); - if (ret < 0) { - dev_err(sdw->cdns.dev, "sync go failed during resume\n"); - return ret; - } - } - } - sdw_cdns_check_self_clearing_bits(cdns, "intel_resume_runtime BUS_RESET", - true, INTEL_MASTER_RESET_ITERATIONS); - } else if (!clock_stop_quirks) { =20 - clock_stop0 =3D sdw_cdns_is_clock_stop(&sdw->cdns); - if (!clock_stop0) - dev_err(dev, "%s invalid configuration, clock was not stopped", __func_= _); + intel_check_clock_stop(sdw); =20 ret =3D intel_link_power_up(sdw); if (ret) { - dev_err(dev, "%s failed: %d\n", __func__, ret); + dev_err(dev, "%s: power_up failed: %d\n", __func__, ret); return ret; } =20 - ret =3D sdw_cdns_enable_interrupt(cdns, true); + ret =3D intel_start_bus_after_clock_stop(sdw); if (ret < 0) { - dev_err(dev, "cannot enable interrupts during resume\n"); + dev_err(dev, "%s: cannot start bus after clock stop: %d\n", __func__, r= et); + intel_link_power_down(sdw); return ret; } - - ret =3D sdw_cdns_clock_restart(cdns, false); - if (ret < 0) { - dev_err(dev, "unable to resume master during resume\n"); - return ret; - } - - sdw_cdns_check_self_clearing_bits(cdns, "intel_resume_runtime no_quirks", - true, INTEL_MASTER_RESET_ITERATIONS); } else { - dev_err(dev, "%s clock_stop_quirks %x unsupported\n", + dev_err(dev, "%s: clock_stop_quirks %x unsupported\n", __func__, clock_stop_quirks); ret =3D -EINVAL; } --=20 2.25.1 From nobody Thu Apr 2 22:58:05 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 21D65ECAAD3 for ; Mon, 19 Sep 2022 17:51:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231495AbiISRvq (ORCPT ); Mon, 19 Sep 2022 13:51:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38802 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231425AbiISRvN (ORCPT ); Mon, 19 Sep 2022 13:51:13 -0400 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CA35C45064 for ; Mon, 19 Sep 2022 10:51:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1663609862; x=1695145862; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=c6tZxuELr4NSU9kuMAkq1H8+mPlH4jFBJzfU4tnhLOg=; b=cfdVeli3rU3J+kuoqP1EyQqtKF+H0cl8Q8twK4nYfMzDjdnVz0VbZaCK SJYL0IFoxOM/NM04neyu8t+ao8mBlq2i31HhvJQl3CjoL7NxoFKuYqeT7 rBJ9EZs//kY1r32oSSOecXmkn+MsFe8uFNa1bfqwezHkBX7yMJ8MMPV+9 DihohPlNrqzuTsqoepbqQzJyKxky6qsgLfWj31t10KkBlaBHKWXi9AaLa MpjyZEFBUvovy772TiQoss0LqY5D35f/AJsjg78OIfhP8s5HCnphoLfMF tjZS0C/P2Rs+hebHq8PVj/Yv0WXFogL7IFxvXdkNQhsP4S5OZgopMk2rO Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10475"; a="363429385" X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="363429385" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:51:01 -0700 X-IronPort-AV: E=Sophos;i="5.93,328,1654585200"; d="scan'208";a="863658636" Received: from bard-ubuntu.sh.intel.com ([10.239.185.57]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 10:50:59 -0700 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, bard.liao@intel.com Subject: [PATCH 11/11] soundwire: intel: add helper to stop bus Date: Tue, 20 Sep 2022 01:57:21 +0800 Message-Id: <20220919175721.354679-12-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> References: <20220919175721.354679-1-yung-chuan.liao@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Pierre-Louis Bossart We have three nearly identical sequences to stop the clock, let's introduce a helper to reuse the same code. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Rander Wang Signed-off-by: Bard Liao --- drivers/soundwire/intel.c | 83 +++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 42 deletions(-) diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c index abe14436d874..15fe083e0402 100644 --- a/drivers/soundwire/intel.c +++ b/drivers/soundwire/intel.c @@ -1391,6 +1391,38 @@ static int intel_start_bus_after_clock_stop(struct s= dw_intel *sdw) return 0; } =20 +static int intel_stop_bus(struct sdw_intel *sdw, bool clock_stop) +{ + struct device *dev =3D sdw->cdns.dev; + struct sdw_cdns *cdns =3D &sdw->cdns; + bool wake_enable =3D false; + int ret; + + if (clock_stop) { + ret =3D sdw_cdns_clock_stop(cdns, true); + if (ret < 0) + dev_err(dev, "%s: cannot stop clock: %d\n", __func__, ret); + else + wake_enable =3D true; + } + + ret =3D sdw_cdns_enable_interrupt(cdns, false); + if (ret < 0) { + dev_err(dev, "%s: cannot disable interrupts: %d\n", __func__, ret); + return ret; + } + + ret =3D intel_link_power_down(sdw); + if (ret) { + dev_err(dev, "%s: Link power down failed: %d\n", __func__, ret); + return ret; + } + + intel_shim_wake(sdw, wake_enable); + + return 0; +} + static int sdw_master_read_intel_prop(struct sdw_bus *bus) { struct sdw_master_prop *prop =3D &bus->prop; @@ -1790,20 +1822,12 @@ static int __maybe_unused intel_suspend(struct devi= ce *dev) return 0; } =20 - ret =3D sdw_cdns_enable_interrupt(cdns, false); + ret =3D intel_stop_bus(sdw, false); if (ret < 0) { - dev_err(dev, "cannot disable interrupts on suspend\n"); + dev_err(dev, "%s: cannot stop bus: %d\n", __func__, ret); return ret; } =20 - ret =3D intel_link_power_down(sdw); - if (ret) { - dev_err(dev, "Link power down failed: %d\n", ret); - return ret; - } - - intel_shim_wake(sdw, false); - return 0; } =20 @@ -1824,44 +1848,19 @@ static int __maybe_unused intel_suspend_runtime(str= uct device *dev) clock_stop_quirks =3D sdw->link_res->clock_stop_quirks; =20 if (clock_stop_quirks & SDW_INTEL_CLK_STOP_TEARDOWN) { - - ret =3D sdw_cdns_enable_interrupt(cdns, false); + ret =3D intel_stop_bus(sdw, false); if (ret < 0) { - dev_err(dev, "cannot disable interrupts on suspend\n"); + dev_err(dev, "%s: cannot stop bus during teardown: %d\n", + __func__, ret); return ret; } - - ret =3D intel_link_power_down(sdw); - if (ret) { - dev_err(dev, "Link power down failed: %d\n", ret); - return ret; - } - - intel_shim_wake(sdw, false); - - } else if (clock_stop_quirks & SDW_INTEL_CLK_STOP_BUS_RESET || - !clock_stop_quirks) { - bool wake_enable =3D true; - - ret =3D sdw_cdns_clock_stop(cdns, true); - if (ret < 0) { - dev_err(dev, "cannot enable clock stop on suspend\n"); - wake_enable =3D false; - } - - ret =3D sdw_cdns_enable_interrupt(cdns, false); + } else if (clock_stop_quirks & SDW_INTEL_CLK_STOP_BUS_RESET || !clock_sto= p_quirks) { + ret =3D intel_stop_bus(sdw, true); if (ret < 0) { - dev_err(dev, "cannot disable interrupts on suspend\n"); - return ret; - } - - ret =3D intel_link_power_down(sdw); - if (ret) { - dev_err(dev, "Link power down failed: %d\n", ret); + dev_err(dev, "%s: cannot stop bus during clock_stop: %d\n", + __func__, ret); return ret; } - - intel_shim_wake(sdw, wake_enable); } else { dev_err(dev, "%s clock_stop_quirks %x unsupported\n", __func__, clock_stop_quirks); --=20 2.25.1