From nobody Mon Dec 15 21:29:22 2025 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0C725228387; Wed, 5 Feb 2025 07:42:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.19 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738741364; cv=none; b=shVNMZ5o3woSkeUA9jfaWd8T4YDp8/amIHasQoWpLTo7ZttO0b7XQp67UTOoifNZEK04uJWjsJ/4Atp0jXfdcMDu/KsVT4kyfvLxpaivBEJlz0mQaGYEvCpJjce4Tm3oDFJn31oKw9fHQlSxzWvwbRAjg91fqx+gnYCnW/3YYm8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738741364; c=relaxed/simple; bh=p/XwvEtOayhUcVU2PTtulspq0uwJ29NZ9YwKbi0L6X4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=OaUaDhClI4Il7pgAhWQL1u5UMM/XJg1EZfFfeogRmCcFvphkNtol6tXAuQaAfA1VSYaRXV3ANgjJ1/wFMCxPfaakiymFXmlYZWOhQ6uxGlTO3ogGUd2uGcp1obSJPKTlBIbbjLj4rYsLeIiya05h9HZeX4uuJAN18nQKlJu+Les= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=none smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=oJ5WS/mb; arc=none smtp.client-ip=192.198.163.19 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="oJ5WS/mb" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1738741363; x=1770277363; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=p/XwvEtOayhUcVU2PTtulspq0uwJ29NZ9YwKbi0L6X4=; b=oJ5WS/mbhAWLmEVe+kWFxDNL8icfcv/rNkeO9rBBL8HLDLPZP2qnlvqI hgZnpp9p7iJus1l4vkQtt4n5KtyMbL4288PSaNmh2Y2/WP8aJjPT+mFFO HlXEJQRszm5VE7MBvu4vVPbE3D0jx372Dr42XnX7eh5ElNStW//LWK9GI 2hm7UtWm3cabm4b/DR8CGZAhlutONd+zTz/+1oPImjhSpdHaACd3k6lO7 2jwEhn01usg5vdLD3XB/IDhCgtCgqOLhMxQFl7amRxhNegPNtDUQKwC8o AXSAuVO/YyF1qRCOB6/Bg47AzVN9bcvr1/u3X+wlAxbzl4uPStLg7NDrm A==; X-CSE-ConnectionGUID: eKzGdK7/QGWYBbIh3ZL9DA== X-CSE-MsgGUID: 1Ec/SBrPTnKAKoR48Muo/g== X-IronPort-AV: E=McAfee;i="6700,10204,11336"; a="38499680" X-IronPort-AV: E=Sophos;i="6.13,260,1732608000"; d="scan'208";a="38499680" Received: from fmviesa008.fm.intel.com ([10.60.135.148]) by fmvoesa113.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Feb 2025 23:42:42 -0800 X-CSE-ConnectionGUID: 7GS2XLmFTdSwWip8yyaaEA== X-CSE-MsgGUID: NyCqj0/mQxSPR6VRYHQjvw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.13,260,1732608000"; d="scan'208";a="111004880" Received: from mdroper-mobl2.amr.corp.intel.com (HELO yungchua-desk.intel.com) ([10.124.223.241]) by fmviesa008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Feb 2025 23:42:41 -0800 From: Bard Liao To: linux-sound@vger.kernel.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.dev, bard.liao@intel.com Subject: [PATCH 1/2] soundwire: cadence_master: set frame shape and divider based on actual clk freq Date: Wed, 5 Feb 2025 15:42:31 +0800 Message-ID: <20250205074232.87537-2-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250205074232.87537-1-yung-chuan.liao@linux.intel.com> References: <20250205074232.87537-1-yung-chuan.liao@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Frame shape and curr_dr_freq could be updated by sdw_compute_bus_params(). Peripherals will set curr_dr_freq as their frequency. Managers should do the same. Then update frame shape according to the actual bus frequency. Signed-off-by: Bard Liao Reviewed-by: Ranjani Sridharan Reviewed-by: P=C3=A9ter Ujfalusi --- drivers/soundwire/cadence_master.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence= _master.c index 35b28320f466..350c5fe927ed 100644 --- a/drivers/soundwire/cadence_master.c +++ b/drivers/soundwire/cadence_master.c @@ -1343,7 +1343,7 @@ static u32 cdns_set_initial_frame_shape(int n_rows, i= nt n_cols) return val; } =20 -static void cdns_init_clock_ctrl(struct sdw_cdns *cdns) +static int cdns_init_clock_ctrl(struct sdw_cdns *cdns) { struct sdw_bus *bus =3D &cdns->bus; struct sdw_master_prop *prop =3D &bus->prop; @@ -1357,14 +1357,25 @@ static void cdns_init_clock_ctrl(struct sdw_cdns *c= dns) prop->default_row, prop->default_col); =20 + if (!prop->default_frame_rate || !prop->default_row) { + dev_err(cdns->dev, "Default frame_rate %d or row %d is invalid\n", + prop->default_frame_rate, prop->default_row); + return -EINVAL; + } + /* Set clock divider */ - divider =3D (prop->mclk_freq / prop->max_clk_freq) - 1; + divider =3D (prop->mclk_freq * SDW_DOUBLE_RATE_FACTOR / + bus->params.curr_dr_freq) - 1; =20 cdns_updatel(cdns, CDNS_MCP_CLK_CTRL0, CDNS_MCP_CLK_MCLKD_MASK, divider); cdns_updatel(cdns, CDNS_MCP_CLK_CTRL1, CDNS_MCP_CLK_MCLKD_MASK, divider); =20 + /* Set frame shape base on the actual bus frequency. */ + prop->default_col =3D bus->params.curr_dr_freq / + prop->default_frame_rate / prop->default_row; + /* * Frame shape changes after initialization have to be done * with the bank switch mechanism @@ -1377,6 +1388,8 @@ static void cdns_init_clock_ctrl(struct sdw_cdns *cdn= s) ssp_interval =3D prop->default_frame_rate / SDW_CADENCE_GSYNC_HZ; cdns_writel(cdns, CDNS_MCP_SSP_CTRL0, ssp_interval); cdns_writel(cdns, CDNS_MCP_SSP_CTRL1, ssp_interval); + + return 0; } =20 /** @@ -1410,9 +1423,12 @@ EXPORT_SYMBOL(sdw_cdns_soft_reset); */ int sdw_cdns_init(struct sdw_cdns *cdns) { + int ret; u32 val; =20 - cdns_init_clock_ctrl(cdns); + ret =3D cdns_init_clock_ctrl(cdns); + if (ret) + return ret; =20 sdw_cdns_check_self_clearing_bits(cdns, __func__, false, 0); =20 --=20 2.43.0