From nobody Mon Oct 6 13:17:47 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 A7B5519DF5F; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064240; cv=none; b=cvEnNQCZIosUHVj8vvNNT/Wbz2dBC+YCVdJkSi7HK+zlxVeuxvWX4J7ujTUgn8f8OafcSpXMmb4BsT7mBYOz+jlmKVY3P+0NkX4vurxNzTfUoFKBxhw5MmzIiBxten4hXxa3AyPzTh5COD1ka13zDratJZ+Rzut5o8+nLfjIq9A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064240; c=relaxed/simple; bh=1KgFbaL830HAM3MNE3JN1EOY/k78cs8sRYCNSKRVHVY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FHKg/AXELjuBurt+ULRN0Y19hBCHBQynGTJrbXpCYLcLJ0rLKtmLyQJaV4lAJx+S3NL2LEsTA71k8wz2+/47kXP8v0skQ/7YormMvtEYQvBJJEFcYL8v2vIgrYlUwxtFAlq/HV8fBioDh9lOJPnsvr8Bd7ZQ7usZDOhtefFAkFQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=gzkh/bkL; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="gzkh/bkL" Received: by smtp.kernel.org (Postfix) with ESMTPS id 1E14EC4CEEB; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753064240; bh=1KgFbaL830HAM3MNE3JN1EOY/k78cs8sRYCNSKRVHVY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=gzkh/bkLUngYB0guJzaogM9Bq4iRoEpFuxZo0WAfVTMVBhme+d6jHH5sB6H5emLNu Uo5FVprehHkgmHGO1plJJdLtSO9f680KuaxqqtSKK0AE6m6ddCbTXJECJoYT/3mTYU C3D6zKl9UJEZcBpLMDYGfTek16oywA4Uz1upXoEFenWR3ogH6r6DIzWaMixvSkLKA/ DPIQo7KyqVQA5ZHoXQwMGamdia5+lTLt96eIdr4U+QlS1xAS4T/YCqfkyu0niuut0w K/e9EpDJehp/hqKLCf9/31OiKXR6ktpwuZ2LuBF/cWHOenqhCCbDuuWWQ0xhzbBTyr eoGga1EZCj21g== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0A272C83F1A; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) From: Aaron Kling via B4 Relay Date: Sun, 20 Jul 2025 21:14:55 -0500 Subject: [PATCH v2 01/17] dt-bindings: soc: tegra: pmc: Document Tegra210B01 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 Message-Id: <20250720-t210b01-v2-1-9cb209f1edfc@gmail.com> References: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> In-Reply-To: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Vinod Koul , Kishon Vijay Abraham I , Greg Kroah-Hartman , Nagarjuna Kristam , JC Kuo , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Michael Turquette , Stephen Boyd , Mathias Nyman , Peter De Schrijver , Prashant Gaikwad Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, Thierry Reding , linux-pm@vger.kernel.org, linux-clk@vger.kernel.org, Aaron Kling X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753064238; l=1125; i=webgeek1234@gmail.com; s=20250217; h=from:subject:message-id; bh=C+H3bb9U6dJtsM1fYev4mV3ka4DfyhcjhUX21PtiIEg=; b=FUD75C8xpNKp9W6IDv1M2oqm3+8Ohtvt4e3rhyiaM6DMeLIqpXqSmKz/fUGQUGOwn4As2RRUZ z5b+oBwcUB3DJa1BYlxKYm7ppJU1nThUl+QZS/MJLkQ3ToK8Jy9ARby X-Developer-Key: i=webgeek1234@gmail.com; a=ed25519; pk=TQwd6q26txw7bkK7B8qtI/kcAohZc7bHHGSD7domdrU= X-Endpoint-Received: by B4 Relay for webgeek1234@gmail.com/20250217 with auth_id=342 X-Original-From: Aaron Kling Reply-To: webgeek1234@gmail.com From: Aaron Kling Add the PMC driver compatible strings for Tegra210B01 Signed-off-by: Aaron Kling --- Documentation/devicetree/bindings/soc/tegra/nvidia,tegra20-pmc.yaml | 5 ++= ++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/soc/tegra/nvidia,tegra20-pmc= .yaml b/Documentation/devicetree/bindings/soc/tegra/nvidia,tegra20-pmc.yaml index 7140c312d8986b0b733c519b1e89e360d9602add..eddcafc2f9398ad6fb4d2d46b31= 81ab91c89a229 100644 --- a/Documentation/devicetree/bindings/soc/tegra/nvidia,tegra20-pmc.yaml +++ b/Documentation/devicetree/bindings/soc/tegra/nvidia,tegra20-pmc.yaml @@ -18,6 +18,7 @@ properties: - nvidia,tegra114-pmc - nvidia,tegra124-pmc - nvidia,tegra210-pmc + - nvidia,tegra210b01-pmc =20 reg: maxItems: 1 @@ -346,7 +347,9 @@ allOf: properties: compatible: contains: - const: nvidia,tegra210-pmc + enum: + - nvidia,tegra210-pmc + - nvidia,tegra210b01-pmc then: properties: pinmux: --=20 2.50.1 From nobody Mon Oct 6 13:17:47 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 A7AFF1991D4; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064240; cv=none; b=mdinHa0LPaaq8AcKSASgLyJ3FNUPCztdhhhDPU+6kuzu6RbtoxNEUcSUJKCaG+lHbu0M9wELj7BirQwQchdYsAT+fQ0HZsyNYZyvdGnNsMfVSZvj/JbHi6qlzWJ+s47CzVPG8bxv31AaLQ8vGy+JDugCFWZU8GCOR1M55MMvbPk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064240; c=relaxed/simple; bh=tH3H8zgMbP7z7HPFQ34anWHnf3Cn7AZwpiLAi9WmJp0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NsLzuymZQuiBk0ZnqI6zUGMikzpSXA63KylFA2GNHpi80G4aiqbZKmsqKXkI3Tt9yiEKLiFp3GuWN08mL721fSMhonFrogEMv+NyaGyFqu9XJKi+0DHL1HVq7ZzZq+TT8Mk93iMLK1Scn1LbtYBeGhwPFuNdRjYCXR85KCfMIYs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nIhRwKDt; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nIhRwKDt" Received: by smtp.kernel.org (Postfix) with ESMTPS id 305A2C4CEF6; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753064240; bh=tH3H8zgMbP7z7HPFQ34anWHnf3Cn7AZwpiLAi9WmJp0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=nIhRwKDtRrA8tPFAomq3bmNMoaNjwUXQHqwDQuXOz1SADOOYCk56SZlSgVvaPPFCJ FrgQbLMHen7l/5AAv4i12LsJqqQAoir7u5x+JZIhPy5sfmgFdPv9jCIXRLWbs7lsx1 ER5xTVJxV4BjKRcdkU1cUZKQrK6ynvW7hDEqUc3bpQu4eHGK5aVvoRCPoocBWeQy5g G/5mc4cQ/a1zQaAAOSpcnT1z/PfhIJkLGdHoXRbsEfrIjG8MW4/0kqb9ZBPV7aOqGK Wc602dsS1UBpPkGAvcA9wREmy3Qs/5OttxISjVLrsmwaDZ32n8f5EEI6MH72dSEryE DegnaTqdeQ4aw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2085FC83F22; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) From: Aaron Kling via B4 Relay Date: Sun, 20 Jul 2025 21:14:56 -0500 Subject: [PATCH v2 02/17] dt-bindings: phy: tegra-xusb: Document Tegra210B01 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 Message-Id: <20250720-t210b01-v2-2-9cb209f1edfc@gmail.com> References: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> In-Reply-To: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Vinod Koul , Kishon Vijay Abraham I , Greg Kroah-Hartman , Nagarjuna Kristam , JC Kuo , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Michael Turquette , Stephen Boyd , Mathias Nyman , Peter De Schrijver , Prashant Gaikwad Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, Thierry Reding , linux-pm@vger.kernel.org, linux-clk@vger.kernel.org, Aaron Kling X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753064238; l=949; i=webgeek1234@gmail.com; s=20250217; h=from:subject:message-id; bh=UpNpYF6b2E0atbGFOefjF2Dt7IyUMvWdkARxBy1JuV0=; b=leQBs4fOTFx56689NhbY10lbcJjLOjEPkrvzVuaZtWB05gxb8cmVgMHlKkdmfhz4pe2EBkDX9 8i/Ikyy5xBAB7+boqoeiPvK3fz9nJ6ClD1BTGo90eneB/4qr6y9HF6B X-Developer-Key: i=webgeek1234@gmail.com; a=ed25519; pk=TQwd6q26txw7bkK7B8qtI/kcAohZc7bHHGSD7domdrU= X-Endpoint-Received: by B4 Relay for webgeek1234@gmail.com/20250217 with auth_id=342 X-Original-From: Aaron Kling Reply-To: webgeek1234@gmail.com From: Aaron Kling Add the compatible string for the Tegra210B01 XUSB PHY Acked-by: Rob Herring (Arm) Signed-off-by: Aaron Kling --- .../devicetree/bindings/phy/nvidia,tegra210-xusb-padctl.yaml | 4 = +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/phy/nvidia,tegra210-xusb-pad= ctl.yaml b/Documentation/devicetree/bindings/phy/nvidia,tegra210-xusb-padct= l.yaml index e9237c58ce45df7fa25cac861891b3fe76efe83d..e876be8058d6a37cf006351f478= d29e6b981c672 100644 --- a/Documentation/devicetree/bindings/phy/nvidia,tegra210-xusb-padctl.yaml +++ b/Documentation/devicetree/bindings/phy/nvidia,tegra210-xusb-padctl.yaml @@ -42,7 +42,9 @@ description: | =20 properties: compatible: - const: nvidia,tegra210-xusb-padctl + enum: + - nvidia,tegra210-xusb-padctl + - nvidia,tegra210b01-xusb-padctl =20 reg: maxItems: 1 --=20 2.50.1 From nobody Mon Oct 6 13:17:47 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 B887B1DFD96; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064240; cv=none; b=ZStC78JuqHeF/e+FnNY2v6hyLfeNJviScAQiMffQqbO39IpKiba10pwgXNluTd5yBtxrf+J9vjKBubdDhzb+BWjE12XSl58nS6Bg6TmT+nIg0Nzt7nUdp7rSpJ3zbxpHhb7ipLq1CvWiCDLQRv/t8QdH4Cf4CaVtp3CXdLPgWrg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064240; c=relaxed/simple; bh=+N08sZPiGNzkS31ZMq73XQsRz/6PC2CS+i/IRLP1KHk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kQKnT/Rt4hX6/N29pdvAncGn1Z18kjdNvt5zq0CLjb585xncoc8RXZUy9g3AF2h/dQvQCuejTDamHHYYOrbjTpFAJHV/e4bvBrVVO0CptLUf9ocfqvT4zmwQewVGiBxT5Tyi2nZ2HCBecuFl5yYq97pZBKmeuTXrD8oTmjCeJvo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XH3v0xeD; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="XH3v0xeD" Received: by smtp.kernel.org (Postfix) with ESMTPS id 3E76AC4CEF1; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753064240; bh=+N08sZPiGNzkS31ZMq73XQsRz/6PC2CS+i/IRLP1KHk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=XH3v0xeDRLUNwZvVLXSfSChV9/5puplFLP56SWDE8N5NLfT5/N/LwCLWq/iYq6RA6 Twrq2+/RCq4IyvFUvGTq+2QDWNoYChaNQ9KjBpxhCmFCl1yRJLqGqPsG1ImF2yXzBg mFPzqxQV7iqMnP9uwdj2CnxUnqMsLsqCHewkrpsLgFt1DTmNmaH8ollUge3M98XfJt fPO33n8aja0zRgKXEwDNB8IApTbOvOSyqWCwHWbkcdf5DGj+9kSPUReTR3QIOi68uc VzK9XnSOGTYCtrL/3eEzHaQWpYNM8lTYEXCu5cYstFcvsKjlGuQkljqr/FCN/LnIPI yK/33ohkY1Kbw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3385CC87FC3; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) From: Aaron Kling via B4 Relay Date: Sun, 20 Jul 2025 21:14:57 -0500 Subject: [PATCH v2 03/17] dt-bindings: usb: tegra-xusb: Document Tegra210B01 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 Message-Id: <20250720-t210b01-v2-3-9cb209f1edfc@gmail.com> References: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> In-Reply-To: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Vinod Koul , Kishon Vijay Abraham I , Greg Kroah-Hartman , Nagarjuna Kristam , JC Kuo , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Michael Turquette , Stephen Boyd , Mathias Nyman , Peter De Schrijver , Prashant Gaikwad Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, Thierry Reding , linux-pm@vger.kernel.org, linux-clk@vger.kernel.org, Aaron Kling X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753064238; l=944; i=webgeek1234@gmail.com; s=20250217; h=from:subject:message-id; bh=Nh6f3WIWhHTEV0li2SkjJP6VUkET3tGtA5Y1/bQ0xS4=; b=MKvWtyQKbqNPY3woOWQs4qzFh2uYhbwzLsig4HH0zT8z9D2bKFHp/4x34k1Eh7LjoIRTzAg7A Ru15aqCaWqjAkI7i/a/6aXmAV9EQVrtJke/6159qIKCBUyYDrQv4e+S X-Developer-Key: i=webgeek1234@gmail.com; a=ed25519; pk=TQwd6q26txw7bkK7B8qtI/kcAohZc7bHHGSD7domdrU= X-Endpoint-Received: by B4 Relay for webgeek1234@gmail.com/20250217 with auth_id=342 X-Original-From: Aaron Kling Reply-To: webgeek1234@gmail.com From: Aaron Kling Add the compatible string for Tegra210B01 XUSB Acked-by: Rob Herring (Arm) Signed-off-by: Aaron Kling --- Documentation/devicetree/bindings/usb/nvidia,tegra210-xusb.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/usb/nvidia,tegra210-xusb.yam= l b/Documentation/devicetree/bindings/usb/nvidia,tegra210-xusb.yaml index c0e313c70bbaba4f5da9cb090ab6f3027d274a2d..543355118282f52b276a0871857= 09320dd8e09d6 100644 --- a/Documentation/devicetree/bindings/usb/nvidia,tegra210-xusb.yaml +++ b/Documentation/devicetree/bindings/usb/nvidia,tegra210-xusb.yaml @@ -15,7 +15,9 @@ description: The Tegra xHCI controller supports both USB2= and USB3 interfaces =20 properties: compatible: - const: nvidia,tegra210-xusb + enum: + - nvidia,tegra210-xusb + - nvidia,tegra210b01-xusb =20 reg: items: --=20 2.50.1 From nobody Mon Oct 6 13:17:47 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 B70621DF977; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064240; cv=none; b=mI5CvA4wcQk4r0l8nDzPRYaekgu9Kf+Ty1mez43GFj3nUcZPbb7gE0OPAgGYEsy1sYlV2I7LjD8pf3AYrnyXYRUNRdQ5cCCrNvCNHe7VqaVVl1xgiBsB8WOsBT36Ul0YTyu7Y4GDf6ueXYHlPBovrYQFU5f7uKDme3JMTxWVFOw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064240; c=relaxed/simple; bh=vuCgT399Tvy3ihYWlKr0gOTWovLoiM7vzL+kV8wI55s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ghhgLeSFrs0yOP/4gPRaflWyyWvKbzc8O/CT9UOtGtRygAVq21MvG/Z0UyS52JBUPaxzeUQWPbFHWk9CSz2jEeFSGpTixpVW1t4EIlSdXGkKqAsPQtSwwZj5yzT1U3mp0bQnaJwnwT66dxMmTQ8RRGCY431O9ELSvf1kDUwwsx8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Q+G0filL; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Q+G0filL" Received: by smtp.kernel.org (Postfix) with ESMTPS id 4E280C113CF; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753064240; bh=vuCgT399Tvy3ihYWlKr0gOTWovLoiM7vzL+kV8wI55s=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=Q+G0filLrq7vo49/af3PJ+W/20Fshr/TjRDG1C2hFobsCHTz1l60oT8hjHCLq6kAy WEfsD97abFZkJKSRV6kgUNHuuyMmMQuJFwh+BsNWRGZT2OLM/lV0Vboml51HgZHM5E HIEdMXf9kmL6jPfx6Y/xGnpjMvSrOoFR4rpXNPhS83teJ5CTiyNgWKvEJz7nMHATH5 VfSsFz/lwkntb5tCxtO37oaf1bhuBE666mZgg+/x2PXZTn/LzFPqL08sEwaqy8y6Jn C8+lgiQtUPWtZx6ETxQn0/3V87cWY8Jw5orbYAejPepg2zR+Q/cci1K2quEtCADXgl a7MClWgAjJSJA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4361EC83F3D; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) From: Aaron Kling via B4 Relay Date: Sun, 20 Jul 2025 21:14:58 -0500 Subject: [PATCH v2 04/17] dt-bindings: usb: tegra-xudc: Document Tegra210B01 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 Message-Id: <20250720-t210b01-v2-4-9cb209f1edfc@gmail.com> References: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> In-Reply-To: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Vinod Koul , Kishon Vijay Abraham I , Greg Kroah-Hartman , Nagarjuna Kristam , JC Kuo , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Michael Turquette , Stephen Boyd , Mathias Nyman , Peter De Schrijver , Prashant Gaikwad Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, Thierry Reding , linux-pm@vger.kernel.org, linux-clk@vger.kernel.org, Aaron Kling X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753064238; l=1193; i=webgeek1234@gmail.com; s=20250217; h=from:subject:message-id; bh=pAfMVat5MDdzgLzxXxUreqZI79lZMEWuOpddgF8NWOo=; b=PUFD7+lE9tSm/n+Tjm7HSerh/lB6BDuUENawVBCaj3KpmbUhn0TTedWYZNMAZYLUm5kf/oCvv lP8esGhRcVrBL+GbiN5mVw5b6Iwf8fKxA4camgnuHvVbJeOzaNd5d2T X-Developer-Key: i=webgeek1234@gmail.com; a=ed25519; pk=TQwd6q26txw7bkK7B8qtI/kcAohZc7bHHGSD7domdrU= X-Endpoint-Received: by B4 Relay for webgeek1234@gmail.com/20250217 with auth_id=342 X-Original-From: Aaron Kling Reply-To: webgeek1234@gmail.com From: Aaron Kling Extend the Tegra XUSB controller device tree binding with Tegra210B01 support. Acked-by: Rob Herring (Arm) Signed-off-by: Aaron Kling --- Documentation/devicetree/bindings/usb/nvidia,tegra-xudc.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/usb/nvidia,tegra-xudc.yaml b= /Documentation/devicetree/bindings/usb/nvidia,tegra-xudc.yaml index c6e661e8915ca4d3e905331299d981f4d3964314..4574e66e7c1d3d3c918991920bb= f4f3ea0ee6ab2 100644 --- a/Documentation/devicetree/bindings/usb/nvidia,tegra-xudc.yaml +++ b/Documentation/devicetree/bindings/usb/nvidia,tegra-xudc.yaml @@ -20,6 +20,7 @@ properties: items: - enum: - nvidia,tegra210-xudc # For Tegra210 + - nvidia,tegra210b01-xudc # For Tegra210B01 - nvidia,tegra186-xudc # For Tegra186 - nvidia,tegra194-xudc # For Tegra194 - nvidia,tegra234-xudc # For Tegra234 @@ -130,6 +131,7 @@ allOf: contains: enum: - nvidia,tegra210-xudc + - nvidia,tegra210b01-xudc then: properties: reg: --=20 2.50.1 From nobody Mon Oct 6 13:17:47 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 D72411E5711; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; cv=none; b=IQS1PriDiM9f5bFniPO12G5y/timzCcP0ape6L5UMluUwzrhJinA8faXRNo2NwMkHEXEByrOMM1SpKCC2MMwjtcIiaIWmrOLQcLasmv8KkHEc6+snogthQKGnSOj3KER9zvHYCo/0uIXy6eMXXrtQcojeCAg8UXXgLm+JIcEETI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; c=relaxed/simple; bh=VEFsUmrh5CUSmdGcsk7A4iu5lTamrHBBQbePPNsb6fM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=upUEMeIJz0gmWJbGHnG640jRNH4oeW44RDee6eNx7uT2r038sl3ELQHUfr8t1VLysyJhytkw8FIly8716D6g6B1OpvIzCO7tZHX2JcL/bzh98nnQa2KZmal2br2jlEWJds+Uz8g42pv1vBDvcNsP+ed9rMXz1HzfjR15c99pYqc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=As6DlLNv; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="As6DlLNv" Received: by smtp.kernel.org (Postfix) with ESMTPS id 5C5C7C19422; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753064240; bh=VEFsUmrh5CUSmdGcsk7A4iu5lTamrHBBQbePPNsb6fM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=As6DlLNveMyvOyjdrp0GBARC/IHENLn/Giurn7XIwO7NClyq3v5Y5lRZ0yZOeCpBM Ef2gV2S3tbtoPBsVOGbd82puhh+lctbm4sDQJg58SPKzxLo/9ZCwXogzZmUlkXDePS sA9qJ/Lf7bC6ElK6z8Ui6/6NQifmc73qMIOonEPd9RUjihR/owmsRD+QY3U0t8waef /l7XZQMROhjp3gST33bh1qqUJbLoxqRRDCm1hwERWcBKw8Ag6Y8WyGA+P6YE0L/oji NUV8sFngEVXGkm7X9FNWPYs6l300SCpWgT9MA0Hci83MAewKnNXu34nrcKRioOAJ03 8qmavTwcd8TNA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 530E1C83F17; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) From: Aaron Kling via B4 Relay Date: Sun, 20 Jul 2025 21:14:59 -0500 Subject: [PATCH v2 05/17] dt-bindings: thermal: tegra: Document Tegra210B01 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 Message-Id: <20250720-t210b01-v2-5-9cb209f1edfc@gmail.com> References: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> In-Reply-To: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Vinod Koul , Kishon Vijay Abraham I , Greg Kroah-Hartman , Nagarjuna Kristam , JC Kuo , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Michael Turquette , Stephen Boyd , Mathias Nyman , Peter De Schrijver , Prashant Gaikwad Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, Thierry Reding , linux-pm@vger.kernel.org, linux-clk@vger.kernel.org, Aaron Kling X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753064238; l=1137; i=webgeek1234@gmail.com; s=20250217; h=from:subject:message-id; bh=k5R1tghQgg5zWHMrFL8NyxLEhTBC0sAbF1cM0lIByUU=; b=PN58npPb+8Yb2p863wVe7T8c3F+xHHfiVNyEIiqJO9Galpibr1KdvL9MTQtkYWbv5kHw7LBbF 6so15kGV/tcBgffSpqCQFcIttSw2jpTIm90rM9NVMQWSYkcCzfbonx3 X-Developer-Key: i=webgeek1234@gmail.com; a=ed25519; pk=TQwd6q26txw7bkK7B8qtI/kcAohZc7bHHGSD7domdrU= X-Endpoint-Received: by B4 Relay for webgeek1234@gmail.com/20250217 with auth_id=342 X-Original-From: Aaron Kling Reply-To: webgeek1234@gmail.com From: Aaron Kling Add the compatible string for Tegra210B01 SOC_THERM Acked-by: Rob Herring (Arm) Signed-off-by: Aaron Kling --- Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml | = 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soct= herm.yaml b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-socth= erm.yaml index 19bb1f324183bb22bc75630798da67fc834920b8..cf47a1f3b3847d4a0371d0bc711= 638fc5e3b6cd3 100644 --- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.ya= ml +++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.ya= ml @@ -21,6 +21,7 @@ properties: - nvidia,tegra124-soctherm - nvidia,tegra132-soctherm - nvidia,tegra210-soctherm + - nvidia,tegra210b01-soctherm =20 reg: maxItems: 2 @@ -207,6 +208,7 @@ allOf: enum: - nvidia,tegra124-soctherm - nvidia,tegra210-soctherm + - nvidia,tegra210b01-soctherm then: properties: reg: --=20 2.50.1 From nobody Mon Oct 6 13:17:47 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 D76F11E833C; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; cv=none; b=LZhpXVSli/7Z8wB11T4uOwm057+B5rGy4/GPrV96tYeb+k/s8ttMKjl0GH2a59xnXpfZfJXXc5K/xpgnoYeGOOWzvxTJ1WJCekd526jNFSE8LSXJd178iXMNbY6iCRy8ZU9xG8oJ8E3dhTjqBaG7IovEcEZBs4NrPcxCXA6GTg4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; c=relaxed/simple; bh=tN+GZ4c/gBEI2UISeTGiT7bSlNC0ur8QtsyWbQbdzek=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fOhLf4tC2IY6r/Jdsq4O0UfPhaghXDDphy8QX0R8EzXc3PV4HsdrD89ODHNSwbDUvaFfGPjo9XgaY6zfDepFl1Y32XPE1T9PBaERW+Zo+5qJYBxwjtiaVRMpxSnWUSJHGV+RnWfqLsE8D3JhCsJg89DB/fp/kfMuF8RgvAXlyvg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qmNZ1uWW; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="qmNZ1uWW" Received: by smtp.kernel.org (Postfix) with ESMTPS id 6CE41C4CEFD; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753064240; bh=tN+GZ4c/gBEI2UISeTGiT7bSlNC0ur8QtsyWbQbdzek=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=qmNZ1uWWPW17FX+YTi2yCRV1aFiMQ4PuWHOcN+blYK0mZrmfRDM1VoJXKlSME5rOk 54KC88rmbmSl8T8VSZyjMLZ0A9XIe41M3+wRfMOwgBkL2DKzn8DpqujqrtAiZhWvdn 2DXtcUiZepSfkLfWvi7x1jEWDHj7t3qsVvB25VyiE5+ezIzyVqXAA2VsHM+I/ufmYN TUR8IC7tG+toR53NcgV7HRbxrVoaeSC17gF4AI1xc406JD6xyhXcZwrnYjRTYsRtN4 6vI4N8zD7u54MQJYv/CxGcKwHSZwy+Y3o8mXTWrd9xwa7ZVy5SVWs+Yck2lNI6Mj35 Tmm/pyzFaAHVA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 637AAC83F1A; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) From: Aaron Kling via B4 Relay Date: Sun, 20 Jul 2025 21:15:00 -0500 Subject: [PATCH v2 06/17] dt-bindings: clock: tegra: Document Tegra210B01 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 Message-Id: <20250720-t210b01-v2-6-9cb209f1edfc@gmail.com> References: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> In-Reply-To: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Vinod Koul , Kishon Vijay Abraham I , Greg Kroah-Hartman , Nagarjuna Kristam , JC Kuo , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Michael Turquette , Stephen Boyd , Mathias Nyman , Peter De Schrijver , Prashant Gaikwad Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, Thierry Reding , linux-pm@vger.kernel.org, linux-clk@vger.kernel.org, Aaron Kling X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753064238; l=1600; i=webgeek1234@gmail.com; s=20250217; h=from:subject:message-id; bh=Cj+m/fB3eeAdMaIIZwt0Ih/S0OtnqsxT3QW3PAC9JvE=; b=O5KPaGIZppqEfJdwPtQFnaBWV/PmQMESQEbEt9SVW75ehrbBGKx4tBjt6LsmYFYVAhrZrzYt1 F2AWSf1yZb5CKSciKkv3G48Q1pv9oKkZNv8G7/JGs753OKwa5Wpqa/A X-Developer-Key: i=webgeek1234@gmail.com; a=ed25519; pk=TQwd6q26txw7bkK7B8qtI/kcAohZc7bHHGSD7domdrU= X-Endpoint-Received: by B4 Relay for webgeek1234@gmail.com/20250217 with auth_id=342 X-Original-From: Aaron Kling Reply-To: webgeek1234@gmail.com From: Aaron Kling * Add the compatible string for Tegra210B01 clock and reset * Add Tegra210B01 specific clock bindings Acked-by: Rob Herring (Arm) Signed-off-by: Aaron Kling --- Documentation/devicetree/bindings/clock/nvidia,tegra20-car.yaml | 1 + include/dt-bindings/clock/tegra210-car.h | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/clock/nvidia,tegra20-car.yam= l b/Documentation/devicetree/bindings/clock/nvidia,tegra20-car.yaml index bee2dd4b29bfe391caee346aa5afad49772c2c41..88cce500bbc43de934f6c56152e= 5b2d006f8a8bb 100644 --- a/Documentation/devicetree/bindings/clock/nvidia,tegra20-car.yaml +++ b/Documentation/devicetree/bindings/clock/nvidia,tegra20-car.yaml @@ -32,6 +32,7 @@ properties: - nvidia,tegra30-car - nvidia,tegra114-car - nvidia,tegra210-car + - nvidia,tegra210b01-car =20 reg: maxItems: 1 diff --git a/include/dt-bindings/clock/tegra210-car.h b/include/dt-bindings= /clock/tegra210-car.h index 9cfcc3baa52c6eef0439c859200cf44446a1cd17..27485d9b80f68fc0e7668a8abbd= 1b821f62035dd 100644 --- a/include/dt-bindings/clock/tegra210-car.h +++ b/include/dt-bindings/clock/tegra210-car.h @@ -409,6 +409,9 @@ #define TEGRA210_CLK_DMIC3_SYNC_CLK 392 #define TEGRA210_CLK_DMIC3_SYNC_CLK_MUX 393 =20 -#define TEGRA210_CLK_CLK_MAX 394 +#define TEGRA210_CLK_UTMIPLL_60M 531 +#define TEGRA210_CLK_PLL_P_UPHY_OUT 532 + +#define TEGRA210_CLK_CLK_MAX 533 =20 #endif /* _DT_BINDINGS_CLOCK_TEGRA210_CAR_H */ --=20 2.50.1 From nobody Mon Oct 6 13:17:47 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 1D0021F4C90; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; cv=none; b=HNTmhuPmyE8hSxRjQ0+pIYwMrjfRI9zilSDq/F9dn2dkeEQc7Qt4BeMNP1XPBEgtmayLdk86HDbzfJi3eq42ggDPHsZTw/7P5SvbwBEDJlWJwG/t7oAft9pMue1x4uWnc8+CbRndylkiNA3G3Kgbxdx+dVJnT1xF1FegAd/7j20= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; c=relaxed/simple; bh=JyF87RPkDaLpT/P1HT3Qoe8Kdjq7ScIPnxVM9dDy2FI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OP6m1yqfVChbFWi7t9Tvn09aaqvQsbrRSXZp8fueq5Vw7Nw2z1dwOYBStZHNy7DzKlPIychp59aY+CW0PcnTI3x6sLKzcCGqN/CSsyupYL0K3hCBhVm5Nn/7e5mF69P/btjXqtA9/qrgOeUnym77Z2kePu/B5IhJRAXJ27Inp20= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ogl8rMKc; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ogl8rMKc" Received: by smtp.kernel.org (Postfix) with ESMTPS id 802EBC2BC87; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753064240; bh=JyF87RPkDaLpT/P1HT3Qoe8Kdjq7ScIPnxVM9dDy2FI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=ogl8rMKcFjFfp4WaJ3OojUvBzj92K6pwdAcGfAiBwQ3klLiuK9XLOfHcbw/wPKt3J a+FmlCIOmtcvO0n1PCFhXAItuwmkzzo40QOSWr7M8mw5oNwnSlqz6X5sdiQuFgZFwS 44z34NwEZQNhI48E64KR8hc425KYBbsGQE8yUUzhpPkWJgtqUkmfb40/2uL46dByk4 PCKxBral+oVzxrIXFzd2HKvOBPrB+oxVvc3Ps4nefXiidCGWRgGD6Xjn7RpO5XdKQe Jye3nyqCUyVAYssUqrYFBTLwtwok+IN3nAm3ipRWRtKIkTKCXqzRWPa22bUrtitPV/ G7jPCZm8+eDZQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7346EC87FC3; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) From: Aaron Kling via B4 Relay Date: Sun, 20 Jul 2025 21:15:01 -0500 Subject: [PATCH v2 07/17] dt-bindings: clock: tegra124-dfll: Document Tegra210B01 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 Message-Id: <20250720-t210b01-v2-7-9cb209f1edfc@gmail.com> References: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> In-Reply-To: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Vinod Koul , Kishon Vijay Abraham I , Greg Kroah-Hartman , Nagarjuna Kristam , JC Kuo , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Michael Turquette , Stephen Boyd , Mathias Nyman , Peter De Schrijver , Prashant Gaikwad Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, Thierry Reding , linux-pm@vger.kernel.org, linux-clk@vger.kernel.org, Aaron Kling X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753064238; l=1036; i=webgeek1234@gmail.com; s=20250217; h=from:subject:message-id; bh=7rvUsu8rYJf8zTq2a+g5h7mFfug/TkyFU9zjev3k0Uw=; b=DrQanWee+Rx+lddFQvDRapAfBnA2NR9vY/ny51dXSZ0bSOOgc1bqODjRYW1wyzQnXGTariAB/ mAcdH679EjYCMp/HlRUV6jJmnA8G+fRhEY9jSMEENisTspEuzUuDWKR X-Developer-Key: i=webgeek1234@gmail.com; a=ed25519; pk=TQwd6q26txw7bkK7B8qtI/kcAohZc7bHHGSD7domdrU= X-Endpoint-Received: by B4 Relay for webgeek1234@gmail.com/20250217 with auth_id=342 X-Original-From: Aaron Kling Reply-To: webgeek1234@gmail.com From: Aaron Kling Add Tegra210B01 support for DFLL clock. Acked-by: Rob Herring (Arm) Signed-off-by: Aaron Kling --- Documentation/devicetree/bindings/clock/nvidia,tegra124-dfll.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/clock/nvidia,tegra124-dfll.t= xt b/Documentation/devicetree/bindings/clock/nvidia,tegra124-dfll.txt index f7d347385b5775ddd702ecbb9821acfc9d4b9ff2..aa7d50d4fe6f2c1c2500c53e342= 1355ce2b67599 100644 --- a/Documentation/devicetree/bindings/clock/nvidia,tegra124-dfll.txt +++ b/Documentation/devicetree/bindings/clock/nvidia,tegra124-dfll.txt @@ -13,6 +13,7 @@ Required properties: - compatible : should be one of: - "nvidia,tegra124-dfll": for Tegra124 - "nvidia,tegra210-dfll": for Tegra210 + - "nvidia,tegra210b01-dfll": for Tegra210B01 - reg : Defines the following set of registers, in the order listed: - registers for the DFLL control logic. - registers for the I2C output logic. --=20 2.50.1 From nobody Mon Oct 6 13:17:47 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 082F61F3B9E; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; cv=none; b=n47TA4vvRL3W9V9eOdjqMDXb09lRbURSRTll8/QZ+c3S6Dq/rhj1S43dYOe6NLL4LYsurCDOrL4cw2q8pHhsqpFiy81fjLIodIUbrSSoB+daDBrWx8AbqipJlwgUFPlSRlwgxRPzVIw5Vu66ZIyKrjpJuJFPkhV4BZg7EKsEB00= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; c=relaxed/simple; bh=ZTv/fjhjELZsx4BTDi8gpF8H8UZzE9gmOjLhh/yxZ6A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IMJe1RM/d6VGBuyk3z1hoxR6OHynIzMomZsZmSB3RJHd4rVfuUd1LA0hlcqkzJiBg1YW8bQYTWNnUmgNtnswNj1LmqB614A5r9bOHkK4wrnQJCSRT5DulFidkoDce02R35REBFjcuuDfxzooNUgFIANcRD5O5n4h1tpyTBR33xY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=kVkemY3T; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="kVkemY3T" Received: by smtp.kernel.org (Postfix) with ESMTPS id A9E2CC4CEE7; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753064240; bh=ZTv/fjhjELZsx4BTDi8gpF8H8UZzE9gmOjLhh/yxZ6A=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=kVkemY3Tyorn+yYkmfOOWpLqrNOlioQSLQdhjY7g/JSw18OCCT5TRMI5dTa7UqVRG fO9I8u/lvlUaM1z0fEht6XPnQ47UM960ooMtdHZAKL5BTJxwBGinj2n6Yvxr09GM7D h60Z6V33wLGYbtI/WNwwBu4BJ1WDZBkmU5RfIQAfNf/Jc7MhUPQ3RQmgq7z92FxkzJ eTmH3vwr0W7MSx5bqz6GGBEkLqXvG7CkYGOcjhnT/hf4wE1pskqZdRDhjwN0cOtVea RwCcdoaoGn7VtxkLErVN9ljYbZQ4wnr+sLWmSyI1vTFp1jdTLvFMLKVqHhowDgutCK QA0XVZlvJm3zw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9DB77C83F17; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) From: Aaron Kling via B4 Relay Date: Sun, 20 Jul 2025 21:15:02 -0500 Subject: [PATCH v2 08/17] dt-bindings: tegra: Document Shield TV 2019 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 Message-Id: <20250720-t210b01-v2-8-9cb209f1edfc@gmail.com> References: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> In-Reply-To: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Vinod Koul , Kishon Vijay Abraham I , Greg Kroah-Hartman , Nagarjuna Kristam , JC Kuo , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Michael Turquette , Stephen Boyd , Mathias Nyman , Peter De Schrijver , Prashant Gaikwad Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, Thierry Reding , linux-pm@vger.kernel.org, linux-clk@vger.kernel.org, Aaron Kling X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753064238; l=1023; i=webgeek1234@gmail.com; s=20250217; h=from:subject:message-id; bh=jUFLE92y2/PfCSBvqONGStmGuDJvfBuTDqHYcdODYfE=; b=8QZhDXxyyxbYWujP3EM+c1w7vC8MFuxCgA84+GksQL8DhJSKxVyanTeWEYaCaUkVOFAwXzVeS 8motLEpoEtUDgGNlCjgLRszJ4dtW4IyP+JrFzORzbltXMVA85ITCPNB X-Developer-Key: i=webgeek1234@gmail.com; a=ed25519; pk=TQwd6q26txw7bkK7B8qtI/kcAohZc7bHHGSD7domdrU= X-Endpoint-Received: by B4 Relay for webgeek1234@gmail.com/20250217 with auth_id=342 X-Original-From: Aaron Kling Reply-To: webgeek1234@gmail.com From: Aaron Kling Add the device tree binding documentation for NVIDIA Shield TV 2019 Signed-off-by: Aaron Kling Reviewed-by: Rob Herring (Arm) --- Documentation/devicetree/bindings/arm/tegra.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Documentation/devicetree/bindings/arm/tegra.yaml b/Documentati= on/devicetree/bindings/arm/tegra.yaml index 9cae3268a8274fd3a38580939c79a6f21de48a3f..11689e040504c57287a8a742c77= 5070a33dfc0ff 100644 --- a/Documentation/devicetree/bindings/arm/tegra.yaml +++ b/Documentation/devicetree/bindings/arm/tegra.yaml @@ -174,6 +174,12 @@ properties: - nvidia,p2571 - nvidia,p2894-0050-a08 - const: nvidia,tegra210 + - description: SHIELD TV Pro 2019 + items: + - const: nvidia,p2894-0050-a08 + - const: nvidia,darcy + - const: nvidia,tegra210b01 + - const: nvidia,tegra210 - description: Jetson TX2 Developer Kit items: - const: nvidia,p2771-0000 --=20 2.50.1 From nobody Mon Oct 6 13:17:47 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 EE2231F0985; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; cv=none; b=qdkVcHpdKmGAnqC/fAEPnfbFqZdizhyVHTPK3YDb4lqepqWbyfvPEdDxAGaF9m7S/bL4wRtSotwIlspUy5bm2oZFdRQCZ1FiigtvccNwydjutuaMEI2GNM1P5/z4LW3PRnjKXvtYz9a9VEUXz6T+/NSFe6wko1OiPsnhwPTqVWE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; c=relaxed/simple; bh=bdC9wX6n4hiDvxjd/IEtrULXnVLCmEutSg8lyBriUwk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MBLEA1x+GmPsqq3vNi2DRCIpFwTVKg2eoCi6z6v74QeMElM0632XRvqyVap0F2xD3Ugeck1WqxIucD4KMzyUH+O7jokcWG2VNgcSuCm6R1N+cL/sbes6XuV0nGKy0cLRpSL299BPjj/cFxS7yAXLafEbHgpPKqo3RVfQF+tuiwY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=a3eIaew3; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="a3eIaew3" Received: by smtp.kernel.org (Postfix) with ESMTPS id C1AD4C4CEFA; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753064240; bh=bdC9wX6n4hiDvxjd/IEtrULXnVLCmEutSg8lyBriUwk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=a3eIaew33b5QylPFnLefSY/eqPiqESzuC3iXjR3iD9RJQ5AijSMd8yi0fNtPfN3/d ja7HSkISaidHsOm1Onqb8YgSQ/9+GTZbP3Le3zHUM89DW0tf/zqRMicgCPSIAuc5nZ VhFu42qyGOhbu5b49TPMwTwKRD+adSyVYtg2+9Pa/zVUl4L9EvbFZ3GLT0S4uwQBKW scBk9t9CVf0gnQDGhApt5Tgjk065bdqYCp1ECFytzpcYxHR+d7HvHwTKFjMIi1aMlY pNi1MMmNSh5rXEsg6JBjmyKypm2M860v4p8IpirqatHQvzkOEAkqc0ddDh9493TPFT S83DMNr3wgLYg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id B7C64C83F22; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) From: Aaron Kling via B4 Relay Date: Sun, 20 Jul 2025 21:15:03 -0500 Subject: [PATCH v2 09/17] soc/tegra: pmc: Add Tegra210B01 support 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 Message-Id: <20250720-t210b01-v2-9-9cb209f1edfc@gmail.com> References: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> In-Reply-To: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Vinod Koul , Kishon Vijay Abraham I , Greg Kroah-Hartman , Nagarjuna Kristam , JC Kuo , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Michael Turquette , Stephen Boyd , Mathias Nyman , Peter De Schrijver , Prashant Gaikwad Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, Thierry Reding , linux-pm@vger.kernel.org, linux-clk@vger.kernel.org, Aaron Kling , Azkali Manad X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753064238; l=7406; i=webgeek1234@gmail.com; s=20250217; h=from:subject:message-id; bh=v2EHSP1hOunXXW1PT0V+1LWhmRxko09yrzRXPz95FzM=; b=y82WX/7KaKy37B3q6ZJHRgHbZKP28zOHOTQIenMfAGVuiYWLrKYVLuqW3CPGF5QsFzM3VGdWi s78fMBXZEe/A4+QNIBorcDaqWkkWJSisejNC7h0r4+P9tnxUd0orJBA X-Developer-Key: i=webgeek1234@gmail.com; a=ed25519; pk=TQwd6q26txw7bkK7B8qtI/kcAohZc7bHHGSD7domdrU= X-Endpoint-Received: by B4 Relay for webgeek1234@gmail.com/20250217 with auth_id=342 X-Original-From: Aaron Kling Reply-To: webgeek1234@gmail.com From: Azkali Manad --- drivers/soc/tegra/pmc.c | 117 ++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 117 insertions(+) diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c index e0d67bfe955cdea6b4703952741b0b9970084d66..689354c280883f7096f007ae714= dad1b379a2852 100644 --- a/drivers/soc/tegra/pmc.c +++ b/drivers/soc/tegra/pmc.c @@ -3732,6 +3732,122 @@ static const struct tegra_pmc_soc tegra210_pmc_soc = =3D { .has_single_mmio_aperture =3D true, }; =20 +static const struct tegra_io_pad_soc tegra210b01_io_pads[] =3D { + TEGRA_IO_PAD(TEGRA_IO_PAD_AUDIO, 17, 0x1b8, 0x1bc, 5, "audio"), + TEGRA_IO_PAD(TEGRA_IO_PAD_AUDIO_HV, 29, 0x1c0, 0x1c4, 18, "audio-hv"), + TEGRA_IO_PAD(TEGRA_IO_PAD_CAM, 4, 0x1c0, 0x1c4, 10, "cam"), + TEGRA_IO_PAD(TEGRA_IO_PAD_CSIA, 0, 0x1b8, 0x1bc, UINT_MAX, "csia"), + TEGRA_IO_PAD(TEGRA_IO_PAD_CSIB, 1, 0x1b8, 0x1bc, UINT_MAX, "csib"), + TEGRA_IO_PAD(TEGRA_IO_PAD_CSIC, 10, 0x1c0, 0x1c4, UINT_MAX, "csic"), + TEGRA_IO_PAD(TEGRA_IO_PAD_CSID, 11, 0x1c0, 0x1c4, UINT_MAX, "csid"), + TEGRA_IO_PAD(TEGRA_IO_PAD_CSIE, 12, 0x1c0, 0x1c4, UINT_MAX, "csie"), + TEGRA_IO_PAD(TEGRA_IO_PAD_CSIF, 13, 0x1c0, 0x1c4, UINT_MAX, "csif"), + TEGRA_IO_PAD(TEGRA_IO_PAD_DBG, 25, 0x1b8, 0x1bc, 19, "dbg"), + TEGRA_IO_PAD(TEGRA_IO_PAD_DEBUG_NONAO, 26, 0x1b8, 0x1bc, UINT_MAX, "debug= -nonao"), + TEGRA_IO_PAD(TEGRA_IO_PAD_DMIC, 18, 0x1c0, 0x1c4, 20, "dmic"), + TEGRA_IO_PAD(TEGRA_IO_PAD_DP, 19, 0x1c0, 0x1c4, UINT_MAX, "dp"), + TEGRA_IO_PAD(TEGRA_IO_PAD_DSI, 2, 0x1b8, 0x1bc, UINT_MAX, "dsi"), + TEGRA_IO_PAD(TEGRA_IO_PAD_DSIB, 7, 0x1c0, 0x1c4, UINT_MAX, "dsib"), + TEGRA_IO_PAD(TEGRA_IO_PAD_DSIC, 8, 0x1c0, 0x1c4, UINT_MAX, "dsic"), + TEGRA_IO_PAD(TEGRA_IO_PAD_DSID, 9, 0x1c0, 0x1c4, UINT_MAX, "dsid"), + TEGRA_IO_PAD(TEGRA_IO_PAD_EMMC, 3, 0x1c0, 0x1c4, UINT_MAX, "emmc"), + TEGRA_IO_PAD(TEGRA_IO_PAD_EMMC2, 5, 0x1c0, 0x1c4, UINT_MAX, "emmc2"), + TEGRA_IO_PAD(TEGRA_IO_PAD_GPIO, 27, 0x1b8, 0x1bc, 21, "gpio"), + TEGRA_IO_PAD(TEGRA_IO_PAD_HDMI, 28, 0x1b8, 0x1bc, UINT_MAX, "hdmi"), + TEGRA_IO_PAD(TEGRA_IO_PAD_HSIC, 19, 0x1b8, 0x1bc, UINT_MAX, "hsic"), + TEGRA_IO_PAD(TEGRA_IO_PAD_LVDS, 25, 0x1c0, 0x1c4, UINT_MAX, "lvds"), + TEGRA_IO_PAD(TEGRA_IO_PAD_MIPI_BIAS, 3, 0x1b8, 0x1bc, UINT_MAX, "mipi-bia= s"), + TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_BIAS, 4, 0x1b8, 0x1bc, UINT_MAX, "pex-bias"= ), + TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CLK1, 5, 0x1b8, 0x1bc, UINT_MAX, "pex-clk1"= ), + TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CLK2, 6, 0x1b8, 0x1bc, UINT_MAX, "pex-clk2"= ), + TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CNTRL, UINT_MAX, UINT_MAX, UINT_MAX, 11, "p= ex-cntrl"), + TEGRA_IO_PAD(TEGRA_IO_PAD_SDMMC1, 1, 0x1c0, 0x1c4, 12, "sdmmc1"), + TEGRA_IO_PAD(TEGRA_IO_PAD_SDMMC3, 2, 0x1c0, 0x1c4, 13, "sdmmc3"), + TEGRA_IO_PAD(TEGRA_IO_PAD_SPI, 14, 0x1c0, 0x1c4, 22, "spi"), + TEGRA_IO_PAD(TEGRA_IO_PAD_SPI_HV, 15, 0x1c0, 0x1c4, 23, "spi-hv"), + TEGRA_IO_PAD(TEGRA_IO_PAD_UART, 14, 0x1b8, 0x1bc, 2, "uart"), + TEGRA_IO_PAD(TEGRA_IO_PAD_USB0, 9, 0x1b8, 0x1bc, UINT_MAX, "usb0"), + TEGRA_IO_PAD(TEGRA_IO_PAD_USB1, 10, 0x1b8, 0x1bc, UINT_MAX, "usb1"), + TEGRA_IO_PAD(TEGRA_IO_PAD_USB2, 11, 0x1b8, 0x1bc, UINT_MAX, "usb2"), + TEGRA_IO_PAD(TEGRA_IO_PAD_USB3, 18, 0x1b8, 0x1bc, UINT_MAX, "usb3"), + TEGRA_IO_PAD(TEGRA_IO_PAD_USB_BIAS, 12, 0x1b8, 0x1bc, UINT_MAX, "usb-bias= "), +}; + +static const struct pinctrl_pin_desc tegra210b01_pin_descs[] =3D { + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_AUDIO, "audio"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_AUDIO_HV, "audio-hv"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CAM, "cam"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIA, "csia"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIB, "csib"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIC, "csic"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSID, "csid"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIE, "csie"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIF, "csif"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DBG, "dbg"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DEBUG_NONAO, "debug-nonao"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DMIC, "dmic"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DP, "dp"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DSI, "dsi"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DSIB, "dsib"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DSIC, "dsic"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DSID, "dsid"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_EMMC, "emmc"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_EMMC2, "emmc2"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_GPIO, "gpio"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_HDMI, "hdmi"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_HSIC, "hsic"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_LVDS, "lvds"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_MIPI_BIAS, "mipi-bias"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_BIAS, "pex-bias"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CLK1, "pex-clk1"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CLK2, "pex-clk2"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CNTRL, "pex-cntrl"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SDMMC1, "sdmmc1"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SDMMC3, "sdmmc3"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SPI, "spi"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SPI_HV, "spi-hv"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_UART, "uart"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB0, "usb0"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB1, "usb1"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB2, "usb2"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB3, "usb3"), + TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB_BIAS, "usb-bias"), +}; + +static const struct tegra_pmc_soc tegra210b01_pmc_soc =3D { + .supports_core_domain =3D false, + .num_powergates =3D ARRAY_SIZE(tegra210_powergates), + .powergates =3D tegra210_powergates, + .num_cpu_powergates =3D ARRAY_SIZE(tegra210_cpu_powergates), + .cpu_powergates =3D tegra210_cpu_powergates, + .has_tsense_reset =3D true, + .has_gpu_clamps =3D true, + .needs_mbist_war =3D true, + .has_impl_33v_pwr =3D false, + .maybe_tz_only =3D true, + .num_io_pads =3D ARRAY_SIZE(tegra210b01_io_pads), + .io_pads =3D tegra210b01_io_pads, + .num_pin_descs =3D ARRAY_SIZE(tegra210b01_pin_descs), + .pin_descs =3D tegra210b01_pin_descs, + .regs =3D &tegra20_pmc_regs, + .init =3D tegra20_pmc_init, + .setup_irq_polarity =3D tegra20_pmc_setup_irq_polarity, + .powergate_set =3D tegra114_powergate_set, + .irq_set_wake =3D tegra210_pmc_irq_set_wake, + .irq_set_type =3D tegra210_pmc_irq_set_type, + .reset_sources =3D tegra210_reset_sources, + .num_reset_sources =3D ARRAY_SIZE(tegra210_reset_sources), + .reset_levels =3D NULL, + .num_reset_levels =3D 0, + .num_wake_events =3D ARRAY_SIZE(tegra210_wake_events), + .wake_events =3D tegra210_wake_events, + .pmc_clks_data =3D tegra_pmc_clks_data, + .num_pmc_clks =3D ARRAY_SIZE(tegra_pmc_clks_data), + .has_blink_output =3D true, + .has_usb_sleepwalk =3D true, + .has_single_mmio_aperture =3D true, +}; + static const struct tegra_io_pad_soc tegra186_io_pads[] =3D { TEGRA_IO_PAD(TEGRA_IO_PAD_CSIA, 0, 0x74, 0x78, UINT_MAX, "csia"), TEGRA_IO_PAD(TEGRA_IO_PAD_CSIB, 1, 0x74, 0x78, UINT_MAX, "csib"), @@ -4253,6 +4369,7 @@ static const struct of_device_id tegra_pmc_match[] = =3D { { .compatible =3D "nvidia,tegra194-pmc", .data =3D &tegra194_pmc_soc }, { .compatible =3D "nvidia,tegra186-pmc", .data =3D &tegra186_pmc_soc }, { .compatible =3D "nvidia,tegra210-pmc", .data =3D &tegra210_pmc_soc }, + { .compatible =3D "nvidia,tegra210b01-pmc", .data =3D &tegra210b01_pmc_so= c }, { .compatible =3D "nvidia,tegra132-pmc", .data =3D &tegra124_pmc_soc }, { .compatible =3D "nvidia,tegra124-pmc", .data =3D &tegra124_pmc_soc }, { .compatible =3D "nvidia,tegra114-pmc", .data =3D &tegra114_pmc_soc }, --=20 2.50.1 From nobody Mon Oct 6 13:17:47 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 5B6E520E716; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; cv=none; b=Dl8Z2rg+whsBh18mBFwfaDDoq0fN3vUfiPmltrdHS4SVGxklV9xstM6+4scfynjoPUyMuAQZTOiuArNyBSe2GHRB1am5jvNi4PjfTeSc3I2dd3opIwINsEpXszKZ5tGAWvzxkvKTpc1HSH05ON7h5lX5yKrtOFtlJSEqNyZZ+pI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; c=relaxed/simple; bh=ON0v9G9aD+DQBoxown/r7aOQOp8k+PV5Jlf1haFJoFY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=r9Wr18vMLXTcvrxEOx5xzxm7+wueklVe2+/AU3NgsaNsRzD3MCTFEE+LX4UMqfo1OTtJLNC5IMy2F0pRg3/l6giPXHVP39Dwuzv/0FTbim5kQOPdHMuUUhir4KZ/mlLgdarRZgFAtzWwmwVOp50uubuU9z4ODcn5iZuPhNpqPjY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uFfUBpHK; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uFfUBpHK" Received: by smtp.kernel.org (Postfix) with ESMTPS id E452DC4CEF6; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753064241; bh=ON0v9G9aD+DQBoxown/r7aOQOp8k+PV5Jlf1haFJoFY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=uFfUBpHKTg7hVsVZGXUZmWcMo3uuRDXryn9KcPqvv+OR0JWMp74V5Wl0oGaVLSEN5 X0nX42FOyVObH2rRqRrYTYV23q5FOeNYRNEvG1DlH8zbeSFPQ77fwCEyTzQlfcTwPV 2ke9zn615zkBbVnFb1z0OaagSz7rFATrVoV7n56s/EFSDn7wzsoUkKYVjztimR5fJu AzmClx9vtEAN0yHuVJvDC2VKVEHXjsKdxFTZ1IRM6T6KUUc609bjBoTradPBmxHhk/ MUyClW4AQv2maG9THiWtssaOvnK5XjK0tKpz0f2Ho5lgdBKfynRuyS7byAoDoFhgaF mDwhxJJPGvuSw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id D8B94C83F1A; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) From: Aaron Kling via B4 Relay Date: Sun, 20 Jul 2025 21:15:04 -0500 Subject: [PATCH v2 10/17] phy: tegra: xusb: Add Tegra201B01 Support 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 Message-Id: <20250720-t210b01-v2-10-9cb209f1edfc@gmail.com> References: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> In-Reply-To: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Vinod Koul , Kishon Vijay Abraham I , Greg Kroah-Hartman , Nagarjuna Kristam , JC Kuo , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Michael Turquette , Stephen Boyd , Mathias Nyman , Peter De Schrijver , Prashant Gaikwad Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, Thierry Reding , linux-pm@vger.kernel.org, linux-clk@vger.kernel.org, Aaron Kling X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753064238; l=4435; i=webgeek1234@gmail.com; s=20250217; h=from:subject:message-id; bh=DyjvlYeFWjuF8INqah0YPKPBr520ThqIor4dBP2TbD8=; b=n/W32LZg64avh0iv4/SI5gHqvkoR3TYgbJPm4iyJuxFUc7bJjMw1fyIEu7XBWnyZpy1ZlfPrr Bb430hLd5usBkFeTjOWXYpFZkZoRzRa2zzVJh1EWmy4DFjTYywY0GTZ X-Developer-Key: i=webgeek1234@gmail.com; a=ed25519; pk=TQwd6q26txw7bkK7B8qtI/kcAohZc7bHHGSD7domdrU= X-Endpoint-Received: by B4 Relay for webgeek1234@gmail.com/20250217 with auth_id=342 X-Original-From: Aaron Kling Reply-To: webgeek1234@gmail.com From: Aaron Kling It has slightly different lanes compared to the original Tegra210. Signed-off-by: Aaron Kling --- drivers/phy/tegra/xusb-tegra210.c | 41 +++++++++++++++++++++++++++++++++++= ++++ drivers/phy/tegra/xusb.c | 4 ++++ drivers/phy/tegra/xusb.h | 1 + 3 files changed, 46 insertions(+) diff --git a/drivers/phy/tegra/xusb-tegra210.c b/drivers/phy/tegra/xusb-teg= ra210.c index ebc8a7e21a318160b162113eea8a6c97b7ed7966..06b587f84270cdea2ea397e55e1= e326e270d4caa 100644 --- a/drivers/phy/tegra/xusb-tegra210.c +++ b/drivers/phy/tegra/xusb-tegra210.c @@ -2559,6 +2559,15 @@ static const struct tegra_xusb_lane_soc tegra210_pci= e_lanes[] =3D { TEGRA210_UPHY_LANE("pcie-6", 0x028, 24, 0x3, pcie, XUSB_PADCTL_UPHY_MISC_= PAD_PX_CTL2(6)), }; =20 +static const struct tegra_xusb_lane_soc tegra210b01_pcie_lanes[] =3D { + TEGRA210_UPHY_LANE("pcie-0", 0x028, 12, 0x3, pcie, XUSB_PADCTL_UPHY_MISC_= PAD_PX_CTL2(0)), + TEGRA210_UPHY_LANE("pcie-1", 0x028, 14, 0x3, pcie, XUSB_PADCTL_UPHY_MISC_= PAD_PX_CTL2(1)), + TEGRA210_UPHY_LANE("pcie-2", 0x028, 16, 0x3, pcie, XUSB_PADCTL_UPHY_MISC_= PAD_PX_CTL2(2)), + TEGRA210_UPHY_LANE("pcie-3", 0x028, 18, 0x3, pcie, XUSB_PADCTL_UPHY_MISC_= PAD_PX_CTL2(3)), + TEGRA210_UPHY_LANE("pcie-4", 0x028, 20, 0x3, pcie, XUSB_PADCTL_UPHY_MISC_= PAD_PX_CTL2(4)), + TEGRA210_UPHY_LANE("pcie-5", 0x028, 22, 0x3, pcie, XUSB_PADCTL_UPHY_MISC_= PAD_PX_CTL2(5)), +}; + static struct tegra_xusb_usb3_port * tegra210_lane_to_usb3_port(struct tegra_xusb_lane *lane) { @@ -2847,6 +2856,13 @@ static const struct tegra_xusb_pad_soc tegra210_pcie= _pad =3D { .ops =3D &tegra210_pcie_ops, }; =20 +static const struct tegra_xusb_pad_soc tegra210b01_pcie_pad =3D { + .name =3D "pcie", + .num_lanes =3D ARRAY_SIZE(tegra210b01_pcie_lanes), + .lanes =3D tegra210b01_pcie_lanes, + .ops =3D &tegra210_pcie_ops, +}; + static const struct tegra_xusb_lane_soc tegra210_sata_lanes[] =3D { TEGRA210_UPHY_LANE("sata-0", 0x028, 30, 0x3, pcie, XUSB_PADCTL_UPHY_MISC_= PAD_S0_CTL2), }; @@ -3016,6 +3032,11 @@ static const struct tegra_xusb_pad_soc * const tegra= 210_pads[] =3D { &tegra210_sata_pad, }; =20 +static const struct tegra_xusb_pad_soc * const tegra210b01_pads[] =3D { + &tegra210_usb2_pad, + &tegra210b01_pcie_pad, +}; + static int tegra210_usb2_port_enable(struct tegra_xusb_port *port) { return 0; @@ -3290,6 +3311,26 @@ const struct tegra_xusb_padctl_soc tegra210_xusb_pad= ctl_soc =3D { }; EXPORT_SYMBOL_GPL(tegra210_xusb_padctl_soc); =20 +const struct tegra_xusb_padctl_soc tegra210b01_xusb_padctl_soc =3D { + .num_pads =3D ARRAY_SIZE(tegra210b01_pads), + .pads =3D tegra210b01_pads, + .ports =3D { + .usb2 =3D { + .ops =3D &tegra210_usb2_port_ops, + .count =3D 4, + }, + .usb3 =3D { + .ops =3D &tegra210_usb3_port_ops, + .count =3D 4, + }, + }, + .ops =3D &tegra210_xusb_padctl_ops, + .supply_names =3D tegra210_xusb_padctl_supply_names, + .num_supplies =3D ARRAY_SIZE(tegra210_xusb_padctl_supply_names), + .need_fake_usb3_port =3D true, +}; +EXPORT_SYMBOL_GPL(tegra210b01_xusb_padctl_soc); + MODULE_AUTHOR("Andrew Bresticker "); MODULE_DESCRIPTION("NVIDIA Tegra 210 XUSB Pad Controller driver"); MODULE_LICENSE("GPL v2"); diff --git a/drivers/phy/tegra/xusb.c b/drivers/phy/tegra/xusb.c index c89df95aa6ca988ea02df6220061be5c7f2c9a46..4a55f1dde660a502d3ff1ab4a27= 5a3f97f19632d 100644 --- a/drivers/phy/tegra/xusb.c +++ b/drivers/phy/tegra/xusb.c @@ -59,6 +59,10 @@ static const struct of_device_id tegra_xusb_padctl_of_ma= tch[] =3D { .compatible =3D "nvidia,tegra210-xusb-padctl", .data =3D &tegra210_xusb_padctl_soc, }, + { + .compatible =3D "nvidia,tegra210b01-xusb-padctl", + .data =3D &tegra210b01_xusb_padctl_soc, + }, #endif #if defined(CONFIG_ARCH_TEGRA_186_SOC) { diff --git a/drivers/phy/tegra/xusb.h b/drivers/phy/tegra/xusb.h index 6e45d194c68947618778dc132720ae757f5fd656..a2074dd3770449c64157e60ef23= 0cefc27238ceb 100644 --- a/drivers/phy/tegra/xusb.h +++ b/drivers/phy/tegra/xusb.h @@ -503,6 +503,7 @@ extern const struct tegra_xusb_padctl_soc tegra124_xusb= _padctl_soc; #endif #if defined(CONFIG_ARCH_TEGRA_210_SOC) extern const struct tegra_xusb_padctl_soc tegra210_xusb_padctl_soc; +extern const struct tegra_xusb_padctl_soc tegra210b01_xusb_padctl_soc; #endif #if defined(CONFIG_ARCH_TEGRA_186_SOC) extern const struct tegra_xusb_padctl_soc tegra186_xusb_padctl_soc; --=20 2.50.1 From nobody Mon Oct 6 13:17:47 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 225AE1F5834; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; cv=none; b=C4b7gBnzOkN30YWTA2saRt5NUeub09o7KTT13uTg2zR2jeOaAUnN6FoCkgxH+D11bvE0SHFvWdqxUt9osatOQcOA04UJ5u5wP+75tT2n2nUMktJht1a59LMxeVjL/vC6TR6x1b/nSXLjlH/eJP1ga+rGqsXTyGGB1seM0eVnhOs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; c=relaxed/simple; bh=sA5jK2V5skay2wNZXk62Cnr/WW7u/wNzJuiuJRLLdvg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Q7UM7YX1NbQpJarV1xH4x8MnGVfXMMm8SGbJ2H2XcC6+XdSpamEXYIq71fMbT2gGZX8at88wO6g+3nPszdT7UsLeKMjsJBOTu759eJ4kXkOVyZbzgFNtVxpgVfbSg6t2oJAD70RDfE+26I+Ml5fnDACTLguggype5wSL1lV7wYQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=r2KQxA5d; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="r2KQxA5d" Received: by smtp.kernel.org (Postfix) with ESMTPS id F334CC4CEFC; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753064241; bh=sA5jK2V5skay2wNZXk62Cnr/WW7u/wNzJuiuJRLLdvg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=r2KQxA5dXmLXDwvI1+pikYMX4+MGn6TRE7GyyZdPY5R9v6gRYoVtRZcUc4I6Cg/UA ilh2fXPD5JNlSj90nC9aSCASBD/mitoM4oP5a1KyWX7kue4jkKxmOS0hezD6bXGhas 9HG16/V1ow0tixKb9rAJBbUXFCIT5hdjwyWRfJEGPbrQManeyuvq1155EYzKSfzrLe UMHmy/Dnxjb/XpfRPInVrqrv2EIvifJYC4mCHkF8u3n82KPtJtl+CJfQ8ywLYc9CfZ RemoXk4d/3Rj/ZYlJi3m/IDMNT/N0ayoVymITT9ti9BFpOiWew31EDJzejKwzIy3Tq +FneX5u52Aj9g== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id EA2EDC87FC5; Mon, 21 Jul 2025 02:17:20 +0000 (UTC) From: Aaron Kling via B4 Relay Date: Sun, 20 Jul 2025 21:15:05 -0500 Subject: [PATCH v2 11/17] usb: xhci: tegra: Add Tegra210B01 support 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 Message-Id: <20250720-t210b01-v2-11-9cb209f1edfc@gmail.com> References: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> In-Reply-To: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Vinod Koul , Kishon Vijay Abraham I , Greg Kroah-Hartman , Nagarjuna Kristam , JC Kuo , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Michael Turquette , Stephen Boyd , Mathias Nyman , Peter De Schrijver , Prashant Gaikwad Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, Thierry Reding , linux-pm@vger.kernel.org, linux-clk@vger.kernel.org, Aaron Kling X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753064238; l=1932; i=webgeek1234@gmail.com; s=20250217; h=from:subject:message-id; bh=u4MyJKHAAFOoAMSOmgjeS/X4Ejtyfwszu/1wKGnsxoU=; b=tA5ONdEvrWoKhcaOrjdxpAymCR/aSkTi7yRM2gWunDmn7Rfg89bxZ6y9P9BZUVGXYItGvdMIK THthuPCQNTZDg9m/LCrcMj5i8gKD9gNXwhqI4lIdLRhxYhZM+8sjUYJ X-Developer-Key: i=webgeek1234@gmail.com; a=ed25519; pk=TQwd6q26txw7bkK7B8qtI/kcAohZc7bHHGSD7domdrU= X-Endpoint-Received: by B4 Relay for webgeek1234@gmail.com/20250217 with auth_id=342 X-Original-From: Aaron Kling Reply-To: webgeek1234@gmail.com From: Aaron Kling This uses a different firmware, but is otherwise compatible with Tegra210. --- drivers/usb/host/xhci-tegra.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci-tegra.c index 0c7af44d4dae5066e66bd29c961510892b6e1301..aef100415f453fdd95c83cf511a= 914cf62e3e775 100644 --- a/drivers/usb/host/xhci-tegra.c +++ b/drivers/usb/host/xhci-tegra.c @@ -2547,6 +2547,30 @@ static const struct tegra_xusb_soc tegra210_soc =3D { }; MODULE_FIRMWARE("nvidia/tegra210/xusb.bin"); =20 +static const struct tegra_xusb_soc tegra210b01_soc =3D { + .firmware =3D "nvidia/tegra210b01/xusb.bin", + .supply_names =3D tegra210_supply_names, + .num_supplies =3D ARRAY_SIZE(tegra210_supply_names), + .phy_types =3D tegra210_phy_types, + .num_types =3D ARRAY_SIZE(tegra210_phy_types), + .context =3D &tegra124_xusb_context, + .ports =3D { + .usb2 =3D { .offset =3D 4, .count =3D 4, }, + .hsic =3D { .offset =3D 8, .count =3D 1, }, + .usb3 =3D { .offset =3D 0, .count =3D 4, }, + }, + .scale_ss_clock =3D false, + .has_ipfs =3D true, + .otg_reset_sspi =3D true, + .mbox =3D { + .cmd =3D 0xe4, + .data_in =3D 0xe8, + .data_out =3D 0xec, + .owner =3D 0xf0, + }, +}; +MODULE_FIRMWARE("nvidia/tegra210b01/xusb.bin"); + static const char * const tegra186_supply_names[] =3D { }; MODULE_FIRMWARE("nvidia/tegra186/xusb.bin"); @@ -2659,6 +2683,7 @@ static const struct tegra_xusb_soc tegra234_soc =3D { static const struct of_device_id tegra_xusb_of_match[] =3D { { .compatible =3D "nvidia,tegra124-xusb", .data =3D &tegra124_soc }, { .compatible =3D "nvidia,tegra210-xusb", .data =3D &tegra210_soc }, + { .compatible =3D "nvidia,tegra210b01-xusb", .data =3D &tegra210b01_soc }, { .compatible =3D "nvidia,tegra186-xusb", .data =3D &tegra186_soc }, { .compatible =3D "nvidia,tegra194-xusb", .data =3D &tegra194_soc }, { .compatible =3D "nvidia,tegra234-xusb", .data =3D &tegra234_soc }, --=20 2.50.1 From nobody Mon Oct 6 13:17:47 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 390001FBC92; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; cv=none; b=KHPkO+hrLc3g6vePGzOkmJuR2L9lCRUE0QQJRkWs6lFsYn+f0DRocb5SBiRhJH0GdicJ6MbkmQhLcZdmPW7nrQPSBpS9Jsonl9uIcXNdaoYXWplIrSGzM+IKZJzFH5iOlEt8s0xaTyQeRYnPrYWqBk7p/eHsjvZxsFUL+XIl/TM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; c=relaxed/simple; bh=qp9tUPFQuumYksisjGHPVxkd5k0ASmphuZsAeWWISew=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=P89Mtxr4XXkwYGbNk/4ztUK9E+P/eejE4jS4uv/ckjclDVzzdlIMZWnYmaiwfIcHfcXHREkyBtQAjxl3mJ7Mvtt7wFfskOd/NqSuv/0tKgTX1lL29k9BPtsEyiefHGVsR7hr3xpoRuBXhPkSUu22xLFhPVeVPI7IjdfXJwmFG7w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=tMgDu/p/; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="tMgDu/p/" Received: by smtp.kernel.org (Postfix) with ESMTPS id 11D3DC4CEFB; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753064241; bh=qp9tUPFQuumYksisjGHPVxkd5k0ASmphuZsAeWWISew=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=tMgDu/p/Klfmd52jEZH9nxTP+aC83HmY+nR6oQeGSVg5uBa3kCxAoZaEVIUnw+jYb SZsBa++RzKfCwaNZ+j3WcBs+6UP+yHXz1gypztaN4yBgMC/A2xhh+NDB2K9myD41xQ ATjxvH+Zx73gKiHfp0Tlw/OdJxnLzFWX0zggRHVhMk7c5lntS3WGR+Gcobvf4ie68a isNlSXODLgJuON6zBA16+vvN5MOHjnnwIXr3zrVP/HRUqKUkuPez7vybLRyGSmxXNT NZfA+tO4a7xqDdtIuR7KLWrqkvsbLdJk5ynaMH7Q0BvZ9SvPErjAChgRcFafxMJGVm rHdv3j5BFVD3A== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 05EF1C87FC6; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) From: Aaron Kling via B4 Relay Date: Sun, 20 Jul 2025 21:15:06 -0500 Subject: [PATCH v2 12/17] usb: gadget: tegra-xudc: Add Tegra210B01 Support 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 Message-Id: <20250720-t210b01-v2-12-9cb209f1edfc@gmail.com> References: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> In-Reply-To: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Vinod Koul , Kishon Vijay Abraham I , Greg Kroah-Hartman , Nagarjuna Kristam , JC Kuo , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Michael Turquette , Stephen Boyd , Mathias Nyman , Peter De Schrijver , Prashant Gaikwad Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, Thierry Reding , linux-pm@vger.kernel.org, linux-clk@vger.kernel.org, Aaron Kling X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753064238; l=1624; i=webgeek1234@gmail.com; s=20250217; h=from:subject:message-id; bh=If0Hje67iTpggX4b+9TtDr2gpSLnQeDIgSv7GE82lsA=; b=+NLKfcfz9GwPFjmm4POLuf7fNqzdg2v20Awvp09SyxlKT8iidTCJEY6/kbi1s15fho1B7xgFC 79xu7pkkJNkA9jyXejvfcidxdaNTNNDuZ7gpJFFUGc8Xq4NrtgP5Gr9 X-Developer-Key: i=webgeek1234@gmail.com; a=ed25519; pk=TQwd6q26txw7bkK7B8qtI/kcAohZc7bHHGSD7domdrU= X-Endpoint-Received: by B4 Relay for webgeek1234@gmail.com/20250217 with auth_id=342 X-Original-From: Aaron Kling Reply-To: webgeek1234@gmail.com From: Aaron Kling It doesn't need some of the workarounds that the original Tegra210 does. Signed-off-by: Aaron Kling --- drivers/usb/gadget/udc/tegra-xudc.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/usb/gadget/udc/tegra-xudc.c b/drivers/usb/gadget/udc/t= egra-xudc.c index 2957316fd3d003e8444a825a72d228b7db06febe..1d2fb9bd51c7369dc5d056e49ae= 184659a40406c 100644 --- a/drivers/usb/gadget/udc/tegra-xudc.c +++ b/drivers/usb/gadget/udc/tegra-xudc.c @@ -3652,6 +3652,22 @@ static struct tegra_xudc_soc tegra210_xudc_soc_data = =3D { .has_ipfs =3D true, }; =20 +static struct tegra_xudc_soc tegra210b01_xudc_soc_data =3D { + .supply_names =3D tegra210_xudc_supply_names, + .num_supplies =3D ARRAY_SIZE(tegra210_xudc_supply_names), + .clock_names =3D tegra210_xudc_clock_names, + .num_clks =3D ARRAY_SIZE(tegra210_xudc_clock_names), + .num_phys =3D 4, + .u1_enable =3D false, + .u2_enable =3D true, + .lpm_enable =3D false, + .invalid_seq_num =3D false, + .pls_quirk =3D false, + .port_reset_quirk =3D true, + .port_speed_quirk =3D false, + .has_ipfs =3D true, +}; + static struct tegra_xudc_soc tegra186_xudc_soc_data =3D { .clock_names =3D tegra186_xudc_clock_names, .num_clks =3D ARRAY_SIZE(tegra186_xudc_clock_names), @@ -3698,6 +3714,10 @@ static const struct of_device_id tegra_xudc_of_match= [] =3D { .compatible =3D "nvidia,tegra210-xudc", .data =3D &tegra210_xudc_soc_data }, + { + .compatible =3D "nvidia,tegra210b01-xudc", + .data =3D &tegra210b01_xudc_soc_data + }, { .compatible =3D "nvidia,tegra186-xudc", .data =3D &tegra186_xudc_soc_data --=20 2.50.1 From nobody Mon Oct 6 13:17:47 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 432DA1FBE83; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; cv=none; b=Tbv7tFKxdmM0aNrI/Bvj9ewhF9ixPk0H3+umkcwDP7bKMs1zZyB8Itt+9KRfgju/xiND2cFog5E/ccAPVmmEi/5sEE3qFm+aQ9YoW9FLalIsU/2fEyrlV0wfpvTvlzofh1KqaS4WdUnZI1ATTRaVF8ZvTc6Ke3az1JuddJsh9ws= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; c=relaxed/simple; bh=7+jCaJYTzqaStoSfwBrmbQ61sTl2fo5rInx87dCM9JM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EXA/TpGbr/kajH8IDsp/2mAvo8yWhaGJdBIPyN2SIRCN6WVRJsUD1BgI6GBGeWCx0Qx8pIsGonBvI09WekspArb9uhAy49aBs03LPrPe6UyE9OeEt6te7TEIggkwMGCG5EY/w4lx8DEOFD2kVUHEyIlh2fQCnKsk3K+Lyu6LRVI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UQRugYbR; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UQRugYbR" Received: by smtp.kernel.org (Postfix) with ESMTPS id 223DBC4CEFE; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753064241; bh=7+jCaJYTzqaStoSfwBrmbQ61sTl2fo5rInx87dCM9JM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=UQRugYbRGerkKEAduuKRaqMYQWZicvvlHQzMso555oJhVnuswsUe/Xr8a6htQhDZt fHe7pOrb9WeFfaV3XIHp56YrHRqcZVTfXzTsw43pv/3P+++jO+wypzQjpgsQYl+OwZ NHetwF/+jKANQGdf3IBvLwjtctg/M3RTsi93J5ngIb2XupFEopt8YLUjuOmqRtJdBy btuZvFOSFQ6mEM1aoUVKTIeErwqzjipR8mT057vAeB2NchS0hCFEX4nHV2U7cPLCWV dtbcf4ZqU7YNliWo17WNPP7zSbu5yFUGX/EC5uXavQYXST8aJB3/rhZcgkzQKTAitx ClnA9ql5N6vuw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 162AFC87FC7; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) From: Aaron Kling via B4 Relay Date: Sun, 20 Jul 2025 21:15:07 -0500 Subject: [PATCH v2 13/17] thermal: tegra: Add Tegra210B01 Support 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 Message-Id: <20250720-t210b01-v2-13-9cb209f1edfc@gmail.com> References: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> In-Reply-To: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Vinod Koul , Kishon Vijay Abraham I , Greg Kroah-Hartman , Nagarjuna Kristam , JC Kuo , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Michael Turquette , Stephen Boyd , Mathias Nyman , Peter De Schrijver , Prashant Gaikwad Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, Thierry Reding , linux-pm@vger.kernel.org, linux-clk@vger.kernel.org, Aaron Kling X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753064238; l=4742; i=webgeek1234@gmail.com; s=20250217; h=from:subject:message-id; bh=X9sFXbY3g6CEPdEtGSFPcYYAsaj7iJ9O8yGRXMBB1/8=; b=ggKnfH9xMlNn0Qp31JU5+phLd2reqvQBOqTF1Qb/A00xYDJcwBJEeoLYcu65vS5VjXEBV5X1n Tk2SaTIS8kRAxptbF4THvDoiKw761VSZ04mk2qK3iq8coD1Lb7DhUPX X-Developer-Key: i=webgeek1234@gmail.com; a=ed25519; pk=TQwd6q26txw7bkK7B8qtI/kcAohZc7bHHGSD7domdrU= X-Endpoint-Received: by B4 Relay for webgeek1234@gmail.com/20250217 with auth_id=342 X-Original-From: Aaron Kling Reply-To: webgeek1234@gmail.com From: Aaron Kling Add Tegra210B01 SOC_THERM configuration Signed-off-by: Aaron Kling --- drivers/thermal/tegra/soctherm.c | 4 ++ drivers/thermal/tegra/soctherm.h | 1 + drivers/thermal/tegra/tegra210-soctherm.c | 78 +++++++++++++++++++++++++++= ++++ 3 files changed, 83 insertions(+) diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/socth= erm.c index 926f1052e6de04fc4d5ff78334b52ffe98cdf4ca..e07ae0e5553f38b78f30bb88a0e= 02aca995d7b5a 100644 --- a/drivers/thermal/tegra/soctherm.c +++ b/drivers/thermal/tegra/soctherm.c @@ -2065,6 +2065,10 @@ static const struct of_device_id tegra_soctherm_of_m= atch[] =3D { .compatible =3D "nvidia,tegra210-soctherm", .data =3D &tegra210_soctherm, }, + { + .compatible =3D "nvidia,tegra210b01-soctherm", + .data =3D &tegra210b01_soctherm, + }, #endif { }, }; diff --git a/drivers/thermal/tegra/soctherm.h b/drivers/thermal/tegra/socth= erm.h index 70501e73d586230d3caca8dea0966afd7f23142a..0d80e739b67da23571137db0cc3= 140c8967fa071 100644 --- a/drivers/thermal/tegra/soctherm.h +++ b/drivers/thermal/tegra/soctherm.h @@ -147,6 +147,7 @@ extern const struct tegra_soctherm_soc tegra132_socther= m; =20 #ifdef CONFIG_ARCH_TEGRA_210_SOC extern const struct tegra_soctherm_soc tegra210_soctherm; +extern const struct tegra_soctherm_soc tegra210b01_soctherm; #endif =20 #endif diff --git a/drivers/thermal/tegra/tegra210-soctherm.c b/drivers/thermal/te= gra/tegra210-soctherm.c index d0ff793f18c561230497b57b325ae87f12a7b83a..b9871e12ec20c1f309ae6ff358f= de4f5ce771ea8 100644 --- a/drivers/thermal/tegra/tegra210-soctherm.c +++ b/drivers/thermal/tegra/tegra210-soctherm.c @@ -44,6 +44,14 @@ static const struct tegra_tsensor_configuration tegra210= _tsensor_config =3D { .tsample_ate =3D 480, }; =20 +static const struct tegra_tsensor_configuration tegra210b01_tsensor_config= =3D { + .tall =3D 16300, + .tiddq_en =3D 1, + .ten_count =3D 1, + .tsample =3D 240, + .tsample_ate =3D 480, +}; + static const struct tegra_tsensor_group tegra210_tsensor_group_cpu =3D { .id =3D TEGRA124_SOCTHERM_SENSOR_CPU, .name =3D "cpu", @@ -125,6 +133,12 @@ static const struct tegra_tsensor_group *tegra210_tsen= sor_groups[] =3D { &tegra210_tsensor_group_mem, }; =20 +static const struct tegra_tsensor_group *tegra210b01_tsensor_groups[] =3D { + &tegra210_tsensor_group_cpu, + &tegra210_tsensor_group_gpu, + &tegra210_tsensor_group_pll, +}; + static const struct tegra_tsensor tegra210_tsensors[] =3D { { .name =3D "cpu0", @@ -193,6 +207,58 @@ static const struct tegra_tsensor tegra210_tsensors[] = =3D { }, }; =20 +static const struct tegra_tsensor tegra210b01_tsensors[] =3D { + { + .name =3D "cpu0", + .base =3D 0xc0, + .config =3D &tegra210b01_tsensor_config, + .calib_fuse_offset =3D 0x098, + .fuse_corr_alpha =3D 1085000, + .fuse_corr_beta =3D 3244200, + .group =3D &tegra210_tsensor_group_cpu, + }, { + .name =3D "cpu1", + .base =3D 0xe0, + .config =3D &tegra210b01_tsensor_config, + .calib_fuse_offset =3D 0x084, + .fuse_corr_alpha =3D 1126200, + .fuse_corr_beta =3D -67500, + .group =3D &tegra210_tsensor_group_cpu, + }, { + .name =3D "cpu2", + .base =3D 0x100, + .config =3D &tegra210b01_tsensor_config, + .calib_fuse_offset =3D 0x088, + .fuse_corr_alpha =3D 1098400, + .fuse_corr_beta =3D 2251100, + .group =3D &tegra210_tsensor_group_cpu, + }, { + .name =3D "cpu3", + .base =3D 0x120, + .config =3D &tegra210b01_tsensor_config, + .calib_fuse_offset =3D 0x12c, + .fuse_corr_alpha =3D 1108000, + .fuse_corr_beta =3D 602700, + .group =3D &tegra210_tsensor_group_cpu, + }, { + .name =3D "gpu", + .base =3D 0x180, + .config =3D &tegra210b01_tsensor_config, + .calib_fuse_offset =3D 0x154, + .fuse_corr_alpha =3D 1074300, + .fuse_corr_beta =3D 2734900, + .group =3D &tegra210_tsensor_group_gpu, + }, { + .name =3D "pllx", + .base =3D 0x1a0, + .config =3D &tegra210b01_tsensor_config, + .calib_fuse_offset =3D 0x160, + .fuse_corr_alpha =3D 1039700, + .fuse_corr_beta =3D 6829100, + .group =3D &tegra210_tsensor_group_pll, + }, +}; + /* * Mask/shift bits in FUSE_TSENSOR_COMMON and * FUSE_TSENSOR_COMMON, which are described in @@ -226,3 +292,15 @@ const struct tegra_soctherm_soc tegra210_soctherm =3D { .use_ccroc =3D false, .thermtrips =3D tegra210_tsensor_thermtrips, }; + +const struct tegra_soctherm_soc tegra210b01_soctherm =3D { + .tsensors =3D tegra210b01_tsensors, + .num_tsensors =3D ARRAY_SIZE(tegra210b01_tsensors), + .ttgs =3D tegra210b01_tsensor_groups, + .num_ttgs =3D ARRAY_SIZE(tegra210b01_tsensor_groups), + .tfuse =3D &tegra210_soctherm_fuse, + .thresh_grain =3D TEGRA210_THRESH_GRAIN, + .bptt =3D TEGRA210_BPTT, + .use_ccroc =3D false, + .thermtrips =3D tegra210_tsensor_thermtrips, +}; --=20 2.50.1 From nobody Mon Oct 6 13:17:47 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 6224521127D; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; cv=none; b=RQDF7cs5tr02xSOvE0Lf/lNcnEGTdfBxlIcx0ILOO6xSbSJ7YCQWPmAR+2MkOFBNx1TBnpU/98GmmNKsue+EVnszMLEa5Tt1vKLSXkEz/gwip4SjoR2yRXyP+wuVQit+5Y797qdMdQ3z6Cb30kX6BuSAwc1USCvQV2NDAyx6hmk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; c=relaxed/simple; bh=O4RrAX/gZyqAEolea2r+5Mh2gbxne4E5804o0nsYprs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kTbdZiD0Opm0j2iuGeXynDuvt03JMapdj4e1zMCyg/XwiIjcajk0TpDukzX3JN9DCjrXehdiYs0gUNgHEHRePJ2F/F+5FDneGOI93G2nyDJDycJEFEmiHyBXgaT0rY1T06jh/HYqGS1XbPLtlsQXSQqxB9zdFIdDOc0YOjb6uxk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dYCvVYLX; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="dYCvVYLX" Received: by smtp.kernel.org (Postfix) with ESMTPS id 3BD8CC4CEE7; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753064241; bh=O4RrAX/gZyqAEolea2r+5Mh2gbxne4E5804o0nsYprs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=dYCvVYLXhphbdpgctYuOMlAS5LsELuqHucM5fWLusSxpfO0dh1RgglZhb1YO+0JHj YDrJfTr+mo3GU8PfDxF389ZASs0L0EvMdh4LDd8zABRLIRweyFXPGoc8x+gbcuY0Gh aazQxa6blZa/OTZ5gIc8opPEbkBO+Yei04xMFLpTNesBXFp0AYZavNr5zFTapo/LTy CnpUpeO4GQiba8FYQd/SLKf0BxbGsZwzG+GDe71BYt5Aroq0AGRzW3sMYOHkUNIrrd jIuM6wG/rZWdnGkMnOy9jHZepO7uG3y7mP6i+BkUMZQuNEpYFJX7dEW5eoYZGlWVTm Y1johdAzoAkHw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 32DDDC87FC5; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) From: Aaron Kling via B4 Relay Date: Sun, 20 Jul 2025 21:15:08 -0500 Subject: [PATCH v2 14/17] clk: tegra: Add Tegra210B01 support 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 Message-Id: <20250720-t210b01-v2-14-9cb209f1edfc@gmail.com> References: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> In-Reply-To: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Vinod Koul , Kishon Vijay Abraham I , Greg Kroah-Hartman , Nagarjuna Kristam , JC Kuo , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Michael Turquette , Stephen Boyd , Mathias Nyman , Peter De Schrijver , Prashant Gaikwad Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, Thierry Reding , linux-pm@vger.kernel.org, linux-clk@vger.kernel.org, Aaron Kling X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753064238; l=137477; i=webgeek1234@gmail.com; s=20250217; h=from:subject:message-id; bh=DcZea1r20Z5G5djbOU0JAsWTR3skLGS+BDgecZ2rp84=; b=0dggF+p1gaFvDuI1rlOvD38Dx2BXjN49f1Xd2Kg8I2eHuL7YfwE25q99ff4O9GDJp21N00lCf 1mpkWOVGa0EC+MI2SzknoMyv5Kz/jZO4ODVulgHPRGG4zHT3MsPlIVu X-Developer-Key: i=webgeek1234@gmail.com; a=ed25519; pk=TQwd6q26txw7bkK7B8qtI/kcAohZc7bHHGSD7domdrU= X-Endpoint-Received: by B4 Relay for webgeek1234@gmail.com/20250217 with auth_id=342 X-Original-From: Aaron Kling Reply-To: webgeek1234@gmail.com From: Aaron Kling This is based on the downstream Nvidia 5.10 kernel. That version was semi-integrated into the Tegra210 clock driver. Looking at the existing Tegra210 support, it made more sense to make this a fully independent driver, so that is implemented here. Signed-off-by: Aaron Kling --- drivers/clk/tegra/Makefile | 1 + drivers/clk/tegra/clk-tegra-periph.c | 3 + drivers/clk/tegra/clk-tegra210b01.c | 3758 ++++++++++++++++++++++++++++++= ++++ drivers/clk/tegra/clk-utils.c | 5 +- drivers/clk/tegra/clk.c | 19 +- drivers/clk/tegra/clk.h | 6 + 6 files changed, 3789 insertions(+), 3 deletions(-) diff --git a/drivers/clk/tegra/Makefile b/drivers/clk/tegra/Makefile index a0715cdfc1a4b04a1c681f65cc973a5613fef664..5b8bf38d0b2eb5a5e0e3d7d01dd= 7cd19e0bfc456 100644 --- a/drivers/clk/tegra/Makefile +++ b/drivers/clk/tegra/Makefile @@ -27,6 +27,7 @@ obj-$(CONFIG_TEGRA124_CLK_EMC) +=3D clk-tegra124-emc.o obj-$(CONFIG_ARCH_TEGRA_132_SOC) +=3D clk-tegra124.o obj-y +=3D cvb.o obj-$(CONFIG_ARCH_TEGRA_210_SOC) +=3D clk-tegra210.o +obj-$(CONFIG_ARCH_TEGRA_210_SOC) +=3D clk-tegra210b01.o obj-$(CONFIG_ARCH_TEGRA_210_SOC) +=3D clk-tegra210-emc.o obj-$(CONFIG_CLK_TEGRA_BPMP) +=3D clk-bpmp.o obj-y +=3D clk-utils.o diff --git a/drivers/clk/tegra/clk-tegra-periph.c b/drivers/clk/tegra/clk-t= egra-periph.c index 4dcf7f7cb8a09875848a7ef2bd346102ae10d46b..12598dcff7f125d66c7a46fed59= f0cfc82b0502e 100644 --- a/drivers/clk/tegra/clk-tegra-periph.c +++ b/drivers/clk/tegra/clk-tegra-periph.c @@ -878,6 +878,9 @@ static void __init periph_clk_init(void __iomem *clk_ba= se, if (!bank) continue; =20 + if (tegra_clks[data->clk_id].use_integer_div) + data->periph.divider.flags |=3D TEGRA_DIVIDER_INT; + data->periph.gate.regs =3D bank; clk =3D tegra_clk_register_periph_data(clk_base, data); *dt_clk =3D clk; diff --git a/drivers/clk/tegra/clk-tegra210b01.c b/drivers/clk/tegra/clk-te= gra210b01.c new file mode 100644 index 0000000000000000000000000000000000000000..b6228798871836d654b8c8155dd= d345d92ba7b30 --- /dev/null +++ b/drivers/clk/tegra/clk-tegra210b01.c @@ -0,0 +1,3758 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2017-2020 NVIDIA CORPORATION. All rights reserved. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "clk.h" +#include "clk-dfll.h" +#include "clk-id.h" + +/* + * TEGRA210_CAR_BANK_COUNT: the number of peripheral clock register + * banks present in the Tegra210 CAR IP block. The banks are + * identified by single letters, e.g.: L, H, U, V, W, X, Y. See + * periph_regs[] in drivers/clk/tegra/clk.c + */ +#define TEGRA210_CAR_BANK_COUNT 7 + +#define CLK_SOURCE_CSITE 0x1d4 +#define CLK_SOURCE_EMC 0x19c +#define CLK_SOURCE_SOR1 0x410 +#define CLK_SOURCE_SOR0 0x414 +#define CLK_SOURCE_LA 0x1f8 +#define CLK_SOURCE_SDMMC2 0x154 +#define CLK_SOURCE_SDMMC4 0x164 +#define CLK_SOURCE_EMC_DLL 0x664 + +#define PLLE_SS_CTRL 0x68 + +#define PLLC_BASE 0x80 +#define PLLC_OUT 0x84 +#define PLLC_MISC0 0x88 +#define PLLC_MISC1 0x8c +#define PLLC_MISC2 0x5d0 +#define PLLC_MISC3 0x5d4 + +#define PLLC2_BASE 0x4e8 +#define PLLC2_MISC0 0x4ec +#define PLLC2_MISC1 0x4f0 +#define PLLC2_MISC2 0x4f4 +#define PLLC2_MISC3 0x4f8 + +#define PLLC3_BASE 0x4fc +#define PLLC3_MISC0 0x500 +#define PLLC3_MISC1 0x504 +#define PLLC3_MISC2 0x508 +#define PLLC3_MISC3 0x50c + +#define PLLM_BASE 0x90 +#define PLLM_MISC1 0x98 +#define PLLM_MISC2 0x9c +#define PLLP_BASE 0xa0 +#define PLLP_OUTA 0xa4 +#define PLLP_OUTB 0xa8 +#define PLLP_MISC0 0xac +#define PLLP_MISC1 0x680 +#define PLLA_BASE 0xb0 +#define PLLA_OUT 0xb4 +#define PLLA_MISC0 0xbc +#define PLLA_MISC1 0xb8 +#define PLLA_MISC2 0x5d8 +#define PLLD_BASE 0xd0 +#define PLLD_MISC0 0xdc +#define PLLD_MISC1 0xd8 +#define PLLU_BASE 0xc0 +#define PLLU_OUTA 0xc4 +#define PLLU_MISC0 0xcc +#define PLLU_MISC1 0xc8 +#define PLLX_BASE 0xe0 +#define PLLX_MISC0 0xe4 +#define PLLX_MISC1 0x510 +#define PLLX_MISC2 0x514 +#define PLLX_MISC3 0x518 +#define PLLX_MISC4 0x5f0 +#define PLLX_MISC5 0x5f4 +#define PLLE_BASE 0xe8 +#define PLLE_MISC0 0xec +#define PLLD2_BASE 0x4b8 +#define PLLD2_MISC0 0x4bc +#define PLLD2_MISC1 0x570 +#define PLLD2_MISC2 0x574 +#define PLLD2_MISC3 0x578 +#define PLLD2_MISC4 0x76c +#define PLLE_AUX 0x48c +#define PLLRE_BASE 0x4c4 +#define PLLRE_MISC0 0x4c8 +#define PLLRE_OUT1 0x4cc +#define PLLDP_BASE 0x590 +#define PLLDP_MISC 0x594 + +#define PLLC4_BASE 0x5a4 +#define PLLC4_MISC0 0x5a8 +#define PLLC4_OUT 0x5e4 +#define PLLMB_BASE 0x5e8 +#define PLLMB_MISC1 0x5ec +#define PLLA1_BASE 0x6a4 +#define PLLA1_MISC0 0x6a8 +#define PLLA1_MISC1 0x6ac +#define PLLA1_MISC2 0x6b0 +#define PLLA1_MISC3 0x6b4 + +#define CLK_SOURCE_VI 0x148 +#define CLK_SOURCE_SOR0 0x414 +#define CLK_SOURCE_SOR1 0x410 + +#define PLLU_IDDQ_BIT 31 +#define PLLCX_IDDQ_BIT 27 +#define PLLRE_IDDQ_BIT 24 +#define PLLA_IDDQ_BIT 25 +#define PLLD_IDDQ_BIT 20 +#define PLLSS_IDDQ_BIT 18 +#define PLLM_IDDQ_BIT 5 +#define PLLMB_IDDQ_BIT 17 +#define PLLXP_IDDQ_BIT 3 + +#define PLLCX_RESET_BIT 30 + +#define PLL_BASE_LOCK BIT(27) +#define PLLCX_BASE_LOCK BIT(26) +#define PLLE_MISC_LOCK BIT(11) +#define PLLE_MISC_IDDQ_SW_CTRL BIT(14) +#define PLLRE_MISC_LOCK BIT(27) + +#define PLLE_AUX_USE_LOCKDET BIT(3) +#define PLLE_AUX_SS_SEQ_INCLUDE BIT(31) +#define PLLE_AUX_ENABLE_SWCTL BIT(4) +#define PLLE_AUX_SS_SWCTL BIT(6) +#define PLLE_AUX_SEQ_ENABLE BIT(24) + +#define PLL_MISC_LOCK_ENABLE 18 +#define PLLC_MISC_LOCK_ENABLE 24 +#define PLLDU_MISC_LOCK_ENABLE 22 +#define PLLU_MISC_LOCK_ENABLE 29 +#define PLLE_MISC_LOCK_ENABLE 9 +#define PLLRE_MISC_LOCK_ENABLE 30 +#define PLLSS_MISC_LOCK_ENABLE 30 +#define PLLP_MISC_LOCK_ENABLE 18 +#define PLLM_MISC_LOCK_ENABLE 4 +#define PLLMB_MISC_LOCK_ENABLE 16 +#define PLLA_MISC_LOCK_ENABLE 28 +#define PLLU_MISC_LOCK_ENABLE 29 +#define PLLD_MISC_LOCK_ENABLE 18 + +#define PLLA_SDM_DIN_MASK 0xffff +#define PLLA_SDM_EN_MASK BIT(26) + +#define PLLD_SDM_EN_MASK BIT(16) + +#define PLLD2_SDM_EN_MASK BIT(31) +#define PLLD2_SSC_EN_MASK 0 + +#define PLLDP_SS_CFG 0x598 +#define PLLDP_SDM_EN_MASK BIT(31) +#define PLLDP_SSC_EN_MASK BIT(30) +#define PLLDP_SS_CTRL1 0x59c +#define PLLDP_SS_CTRL2 0x5a0 +#define PLLDP_MISC4 0x770 + +#define PMC_PLLM_WB0_OVERRIDE 0x1dc +#define PMC_PLLM_WB0_OVERRIDE_2 0x2b0 + +#define UTMIP_PLL_CFG2 0x488 +#define UTMIP_PLL_CFG2_STABLE_COUNT(x) (((x) & 0xfff) << 6) +#define UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(x) (((x) & 0x3f) << 18) +#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN BIT(0) +#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERUP BIT(1) +#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN BIT(2) +#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERUP BIT(3) +#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN BIT(4) +#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERUP BIT(5) +#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_D_POWERDOWN BIT(24) +#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_D_POWERUP BIT(25) + +#define UTMIP_PLL_CFG1 0x484 +#define UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(x) (((x) & 0x1f) << 27) +#define UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(x) (((x) & 0xfff) << 0) +#define UTMIP_PLL_CFG1_FORCE_PLLU_POWERUP BIT(17) +#define UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN BIT(16) +#define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP BIT(15) +#define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN BIT(14) +#define UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN BIT(12) + +#define UTMIP_PLL_CFG0 0x480 + +#define SATA_PLL_CFG0 0x490 +#define SATA_PLL_CFG0_PADPLL_RESET_SWCTL BIT(0) +#define SATA_PLL_CFG0_PADPLL_USE_LOCKDET BIT(2) +#define SATA_PLL_CFG0_SATA_SEQ_IN_SWCTL BIT(4) +#define SATA_PLL_CFG0_SATA_SEQ_RESET_INPUT_VALUE BIT(5) +#define SATA_PLL_CFG0_SATA_SEQ_LANE_PD_INPUT_VALUE BIT(6) +#define SATA_PLL_CFG0_SATA_SEQ_PADPLL_PD_INPUT_VALUE BIT(7) + +#define SATA_PLL_CFG0_PADPLL_SLEEP_IDDQ BIT(13) +#define SATA_PLL_CFG0_SEQ_ENABLE BIT(24) + +#define XUSBIO_PLL_CFG0 0x51c +#define XUSBIO_PLL_CFG0_PADPLL_RESET_SWCTL BIT(0) +#define XUSBIO_PLL_CFG0_CLK_ENABLE_SWCTL BIT(2) +#define XUSBIO_PLL_CFG0_PADPLL_USE_LOCKDET BIT(6) +#define XUSBIO_PLL_CFG0_PADPLL_SLEEP_IDDQ BIT(13) +#define XUSBIO_PLL_CFG0_SEQ_ENABLE BIT(24) + +#define UTMIPLL_HW_PWRDN_CFG0 0x52c +#define UTMIPLL_HW_PWRDN_CFG0_UTMIPLL_LOCK BIT(31) +#define UTMIPLL_HW_PWRDN_CFG0_SEQ_START_STATE BIT(25) +#define UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE BIT(24) +#define UTMIPLL_HW_PWRDN_CFG0_IDDQ_PD_INCLUDE BIT(7) +#define UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET BIT(6) +#define UTMIPLL_HW_PWRDN_CFG0_SEQ_RESET_INPUT_VALUE BIT(5) +#define UTMIPLL_HW_PWRDN_CFG0_SEQ_IN_SWCTL BIT(4) +#define UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL BIT(2) +#define UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE BIT(1) +#define UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL BIT(0) + +#define PLLU_HW_PWRDN_CFG0 0x530 +#define PLLU_HW_PWRDN_CFG0_IDDQ_PD_INCLUDE BIT(28) +#define PLLU_HW_PWRDN_CFG0_SEQ_ENABLE BIT(24) +#define PLLU_HW_PWRDN_CFG0_USE_SWITCH_DETECT BIT(7) +#define PLLU_HW_PWRDN_CFG0_USE_LOCKDET BIT(6) +#define PLLU_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL BIT(2) +#define PLLU_HW_PWRDN_CFG0_CLK_SWITCH_SWCTL BIT(0) + +#define XUSB_PLL_CFG0 0x534 +#define XUSB_PLL_CFG0_UTMIPLL_LOCK_DLY 0x3ff +#define XUSB_PLL_CFG0_PLLU_LOCK_DLY_MASK (0x3ff << 14) + +#define SPARE_REG0 0x55c +#define CLK_M_DIVISOR_SHIFT 2 +#define CLK_M_DIVISOR_MASK 0x3 + +/* This register is re-purposed on T210b01 as UPHY management clock divide= r */ +#define PEX_SATA_USB_RX_BYP 0x6d0 + +#define CLK_MASK_ARM 0x44 +#define MISC_CLK_ENB 0x48 + +#define RST_DFLL_DVCO 0x2f4 +#define DVFS_DFLL_RESET_SHIFT 0 + +#define CLK_RST_CONTROLLER_CLK_OUT_ENB_X_SET 0x284 +#define CLK_RST_CONTROLLER_CLK_OUT_ENB_X_CLR 0x288 +#define CLK_OUT_ENB_X_CLK_ENB_EMC_DLL BIT(14) + +#define CLK_RST_CONTROLLER_RST_DEV_Y_SET 0x2a8 +#define CLK_RST_CONTROLLER_RST_DEV_Y_CLR 0x2ac +#define CPU_SOFTRST_CTRL 0x380 + +#define LVL2_CLK_GATE_OVRA 0xf8 +#define LVL2_CLK_GATE_OVRC 0x3a0 +#define LVL2_CLK_GATE_OVRD 0x3a4 +#define LVL2_CLK_GATE_OVRE 0x554 + +/* I2S registers to handle during APE MBIST WAR */ +#define TEGRA210_I2S_BASE 0x1000 +#define TEGRA210_I2S_SIZE 0x100 +#define TEGRA210_I2S_CTRLS 5 +#define TEGRA210_I2S_CG 0x88 +#define TEGRA210_I2S_CTRL 0xa0 + +/* DISPA registers to handle during MBIST WAR */ +#define DC_CMD_DISPLAY_COMMAND 0xc8 +#define DC_COM_DSC_TOP_CTL 0xcf8 + +/* VIC register to handle during MBIST WAR */ +#define NV_PVIC_THI_SLCG_OVERRIDE_LOW 0x8c + +/* APE, DISPA and VIC base addesses needed for MBIST WAR */ +#define TEGRA210_AHUB_BASE 0x702d0000 +#define TEGRA210_DISPA_BASE 0x54200000 +#define TEGRA210_VIC_BASE 0x54340000 + +/* + * SDM fractional divisor is 16-bit 2's complement signed number within + * (-2^12 ... 2^12-1) range. Represented in PLL data structure as unsigned + * 16-bit value, with "0" divisor mapped to 0xFFFF. Data "0" is used to + * indicate that SDM is disabled. + * + * Effective ndiv value when SDM is enabled: ndiv + 1/2 + sdm_din/2^13 + */ +#define PLL_SDM_COEFF BIT(13) +#define sdin_din_to_data(din) ((u16)((din) ? : 0xFFFFU)) +#define sdin_data_to_din(dat) (((dat) =3D=3D 0xFFFFU) ? 0 : (s16)dat) +/* This macro returns ndiv effective scaled to SDM range */ +#define sdin_get_n_eff(cfg) ((cfg)->n * PLL_SDM_COEFF + ((cfg)->sdm_data ?= \ + (PLL_SDM_COEFF/2 + sdin_data_to_din((cfg)->sdm_data)) : 0)) + +/* Tegra CPU clock and reset control regs */ +#define CLK_RST_CONTROLLER_CPU_CMPLX_STATUS 0x470 + +#ifdef CONFIG_PM_SLEEP +static struct cpu_clk_suspend_context { + u32 clk_csite_src; +} tegra210_cpu_clk_sctx; +#endif + +struct tegra210_domain_mbist_war { + void (*handle_lvl2_ovr)(struct tegra210_domain_mbist_war *mbist); + const u32 lvl2_offset; + const u32 lvl2_mask; + const unsigned int num_clks; + const unsigned int *clk_init_data; + struct clk_bulk_data *clks; +}; + +static struct clk **clks; + +static void __iomem *clk_base; +static void __iomem *pmc_base; +static void __iomem *ahub_base; +static void __iomem *dispa_base; +static void __iomem *vic_base; + +static unsigned long osc_freq; +static unsigned long pll_ref_freq; +static bool pll_re_use_utmipll; + +static DEFINE_SPINLOCK(pll_d_lock); +static DEFINE_SPINLOCK(pll_e_lock); +static DEFINE_SPINLOCK(pll_re_lock); +static DEFINE_SPINLOCK(pll_u_lock); +static DEFINE_SPINLOCK(pll_p_uphy_lock); +static DEFINE_SPINLOCK(sor0_lock); +static DEFINE_SPINLOCK(sor1_lock); +static DEFINE_SPINLOCK(emc_lock); +static DEFINE_MUTEX(lvl2_ovr_lock); + +/* possible OSC frequencies in Hz */ +static unsigned long tegra210_input_freq[] =3D { + [5] =3D 38400000, + [8] =3D 12000000, +}; + +#define PLL_ENABLE (1 << 30) + +#define PLLCX_MISC1_IDDQ (1 << 27) +#define PLLCX_MISC0_RESET (1 << 30) + +#define PLLCX_MISC0_DEFAULT_VALUE 0x40080000 +#define PLLCX_MISC0_WRITE_MASK 0x400ffffb +#define PLLCX_MISC1_DEFAULT_VALUE 0x08000000 +#define PLLCX_MISC1_WRITE_MASK 0x38003cff +#define PLLCX_MISC2_DEFAULT_VALUE 0x1f720f05 +#define PLLCX_MISC2_WRITE_MASK 0xffffff17 +#define PLLCX_MISC3_DEFAULT_VALUE 0x000000c4 +#define PLLCX_MISC3_WRITE_MASK 0x00ffffff + +/* PLLA */ +#define PLLA_BASE_IDDQ (1 << 25) +#define PLLA_BASE_LOCK (1 << 27) + +#define PLLA_MISC0_LOCK_ENABLE (1 << 28) +#define PLLA_MISC0_LOCK_OVERRIDE (1 << 27) + +#define PLLA_MISC2_EN_SDM (1 << 26) +#define PLLA_MISC2_EN_DYNRAMP (1 << 25) + +#define PLLA_MISC0_DEFAULT_VALUE 0x10000000 +#define PLLA_MISC0_WRITE_MASK 0x7fffffff +#define PLLA_MISC2_DEFAULT_VALUE 0x0 +#define PLLA_MISC2_WRITE_MASK 0x06ffffff + +#define PLLA_OUT_DEFAULT_VALUE 0x00000000 +#define PLLA_OUT_VREG_MASK 0xf0000000 + +/* PLLD */ +#define PLLD_BASE_CSI_CLKSOURCE (1 << 23) + +#define PLLD_MISC0_EN_SDM (1 << 16) +#define PLLD_MISC0_LOCK_OVERRIDE (1 << 17) +#define PLLD_MISC0_LOCK_ENABLE (1 << 18) +#define PLLD_MISC0_IDDQ (1 << 20) +#define PLLD_MISC0_DSI_CLKENABLE (1 << 21) + +#define PLLD_MISC0_DEFAULT_VALUE 0x00140000 +#define PLLD_MISC0_WRITE_MASK 0x3ff7ffff +#define PLLD_MISC1_DEFAULT_VALUE 0x00000000 +#define PLLD_MISC1_WRITE_MASK 0xf0ffffff + +/* PLLD2 and PLLDP and PLLC4 */ +#define PLLDSS_BASE_LOCK (1 << 27) +#define PLLDSS_BASE_LOCK_OVERRIDE (1 << 24) +#define PLLDSS_BASE_IDDQ (1 << 18) +#define PLLDSS_BASE_REF_SEL_SHIFT 25 +#define PLLDSS_BASE_REF_SEL_MASK (0x3 << PLLDSS_BASE_REF_SEL_SHIFT) + +#define PLLDSS_MISC0_LOCK_ENABLE (1 << 30) + +#define PLLDSS_MISC1_CFG_EN_SDM (1 << 31) +#define PLLDSS_MISC1_CFG_EN_SSC (1 << 30) + +#define PLLD2_MISC0_DEFAULT_VALUE 0x40000000 +#define PLLD2_MISC1_CFG_DEFAULT_VALUE 0x10000000 +#define PLLD2_MISC2_CTRL1_DEFAULT_VALUE 0x0 +#define PLLD2_MISC3_CTRL2_DEFAULT_VALUE 0x0 +#define PLLD2_MISC4_VREG_DEFAULT_VALUE 0x0 + +#define PLLDP_MISC0_DEFAULT_VALUE 0x40000000 +#define PLLDP_MISC1_CFG_DEFAULT_VALUE 0xc0000000 +#define PLLDP_MISC2_CTRL1_DEFAULT_VALUE 0xf600f200 +#define PLLDP_MISC3_CTRL2_DEFAULT_VALUE 0x2005f600 +#define PLLDP_MISC4_VREG_DEFAULT_VALUE 0x00000000 + +#define PLLDSS_MISC0_WRITE_MASK 0x47ffffff +#define PLLDSS_MISC1_CFG_WRITE_MASK 0xf8000000 +#define PLLDSS_MISC2_CTRL1_WRITE_MASK 0xffffffff +#define PLLDSS_MISC3_CTRL2_WRITE_MASK 0xffffffff +#define PLLDSS_MISC4_VREG_WRITE_MASK 0xf0000000 + +#define PLLC4_MISC0_DEFAULT_VALUE 0x40000000 +#define PLLC4_OUT_DEFAULT_VALUE 0x00000000 +#define PLLC4_OUT_VREG_MASK 0xf0000000 + +/* PLLRE */ +#define PLLRE_BASE_CLKIN_SEL (1 << 22) + +#define PLLRE_MISC0_LOCK_ENABLE (1 << 30) +#define PLLRE_MISC0_LOCK_OVERRIDE (1 << 29) +#define PLLRE_MISC0_LOCK (1 << 27) +#define PLLRE_MISC0_IDDQ (1 << 24) + +#define PLLRE_BASE_DEFAULT_VALUE 0x0 +#define PLLRE_MISC0_DEFAULT_VALUE 0x41000000 + +#define PLLRE_BASE_DEFAULT_MASK 0x1c000000 +#define PLLRE_MISC0_WRITE_MASK 0x67ffffff + +#define PLLRE_OUT1_DEFAULT_VALUE 0x00000000 +#define PLLRE_OUT1_VREG_MASK 0xf0000000 + +/* PLLX */ +#define PLLX_USE_DYN_RAMP 1 +#define PLLX_BASE_LOCK (1 << 27) + +#define PLLX_MISC0_FO_G_DISABLE (0x1 << 28) +#define PLLX_MISC0_LOCK_ENABLE (0x1 << 18) + +#define PLLX_MISC2_DYNRAMP_STEPB_SHIFT 24 +#define PLLX_MISC2_DYNRAMP_STEPB_MASK (0xFF << PLLX_MISC2_DYNRAMP_STEPB_SH= IFT) +#define PLLX_MISC2_DYNRAMP_STEPA_SHIFT 16 +#define PLLX_MISC2_DYNRAMP_STEPA_MASK (0xFF << PLLX_MISC2_DYNRAMP_STEPA_SH= IFT) +#define PLLX_MISC2_NDIV_NEW_SHIFT 8 +#define PLLX_MISC2_NDIV_NEW_MASK (0xFF << PLLX_MISC2_NDIV_NEW_SHIFT) +#define PLLX_MISC2_LOCK_OVERRIDE (0x1 << 4) +#define PLLX_MISC2_DYNRAMP_DONE (0x1 << 2) +#define PLLX_MISC2_EN_DYNRAMP (0x1 << 0) + +#define PLLX_MISC3_IDDQ (0x1 << 3) + +#define PLLX_MISC0_DEFAULT_VALUE PLLX_MISC0_LOCK_ENABLE +#define PLLX_MISC0_WRITE_MASK 0x10c40000 +#define PLLX_MISC1_DEFAULT_VALUE 0x0 +#define PLLX_MISC1_WRITE_MASK 0xf0ffffff +#define PLLX_MISC2_DEFAULT_VALUE 0x0 +#define PLLX_MISC2_WRITE_MASK 0xffffff11 +#define PLLX_MISC3_DEFAULT_VALUE PLLX_MISC3_IDDQ +#define PLLX_MISC3_WRITE_MASK 0x01ff0f0f +#define PLLX_MISC4_DEFAULT_VALUE 0x0 +#define PLLX_MISC4_WRITE_MASK 0x8000ffff +#define PLLX_MISC5_DEFAULT_VALUE 0x0 +#define PLLX_MISC5_WRITE_MASK 0x0000ffff + +#define PLLX_HW_CTRL_CFG 0x548 +#define PLLX_HW_CTRL_CFG_SWCTRL (0x1 << 0) + +/* PLLMB */ +#define PLLMB_BASE_LOCK (1 << 27) + +#define PLLMB_MISC1_LOCK_OVERRIDE (1 << 18) +#define PLLMB_MISC1_IDDQ (1 << 17) +#define PLLMB_MISC1_LOCK_ENABLE (1 << 16) + +#define PLLMB_MISC1_DEFAULT_VALUE 0x00030000 +#define PLLMB_MISC1_WRITE_MASK 0x0007ffff + +/* PLLP */ +#define PLLP_BASE_OVERRIDE (1 << 28) +#define PLLP_BASE_LOCK (1 << 27) + +#define PLLP_MISC0_LOCK_ENABLE (1 << 18) +#define PLLP_MISC0_LOCK_OVERRIDE (1 << 17) +#define PLLP_MISC0_IDDQ (1 << 3) + +#define PLLP_MISC1_HSIO_EN_SHIFT 29 +#define PLLP_MISC1_HSIO_EN (1 << PLLP_MISC1_HSIO_EN_SHIFT) +#define PLLP_MISC1_XUSB_EN_SHIFT 28 +#define PLLP_MISC1_XUSB_EN (1 << PLLP_MISC1_XUSB_EN_SHIFT) + +#define PLLP_MISC0_DEFAULT_VALUE 0x00040008 +#define PLLP_MISC1_DEFAULT_VALUE 0x0 + +#define PLLP_MISC0_WRITE_MASK 0xfdc6000f +#define PLLP_MISC1_WRITE_MASK 0x70ffffff + +/* PLLU */ +#define PLLU_BASE_LOCK (1 << 27) +#define PLLU_BASE_OVERRIDE (1 << 24) +#define PLLU_BASE_CLKENABLE_USB (1 << 21) +#define PLLU_BASE_CLKENABLE_HSIC (1 << 22) +#define PLLU_BASE_CLKENABLE_ICUSB (1 << 23) +#define PLLU_BASE_CLKENABLE_48M (1 << 25) +#define PLLU_BASE_CLKENABLE_ALL (PLLU_BASE_CLKENABLE_USB |\ + PLLU_BASE_CLKENABLE_HSIC |\ + PLLU_BASE_CLKENABLE_ICUSB |\ + PLLU_BASE_CLKENABLE_48M) + +#define PLLU_BASE_MNP_DEFAULT_VALUE 0x00011902 + +#define PLLU_MISC0_IDDQ (1 << 31) +#define PLLU_MISC0_LOCK_ENABLE (1 << 29) +#define PLLU_MISC1_LOCK_OVERRIDE (1 << 0) + +#define PLLU_MISC0_DEFAULT_VALUE 0xa0000000 +#define PLLU_MISC1_DEFAULT_VALUE 0x0 + +#define PLLU_MISC0_WRITE_MASK 0xbfffffff +#define PLLU_MISC1_WRITE_MASK 0xf0000007 + +/* UTMIPLL */ +#define UTMIP_PLL_CFG0_WRITE_MASK 0x1fffffff +#define UTMIP_PLL_CFG0_DEFAULT_VALUE 0x00190101 + +/* PLLE */ +#define PLLE_SS_ENABLE 1 +#define PLLE_SS_MAX_VAL 0x25 +#define PLLE_SS_INC_VAL (0x1 << 16) +#define PLLE_SS_INCINTRV_VAL (0x20 << 24) +#define PLLE_SS_COEFFICIENTS_VAL \ + (PLLE_SS_MAX_VAL | PLLE_SS_INC_VAL | PLLE_SS_INCINTRV_VAL) + +static void tegra210_generic_mbist_war(struct tegra210_domain_mbist_war *m= bist) +{ + u32 val; + + val =3D readl_relaxed(clk_base + mbist->lvl2_offset); + writel_relaxed(val | mbist->lvl2_mask, clk_base + mbist->lvl2_offset); + fence_udelay(1, clk_base); + writel_relaxed(val, clk_base + mbist->lvl2_offset); + fence_udelay(1, clk_base); +} + +static void tegra210_venc_mbist_war(struct tegra210_domain_mbist_war *mbis= t) +{ + u32 csi_src, ovra, ovre; + unsigned long flags =3D 0; + + spin_lock_irqsave(&pll_d_lock, flags); + + csi_src =3D readl_relaxed(clk_base + PLLD_BASE); + writel_relaxed(csi_src | PLLD_BASE_CSI_CLKSOURCE, clk_base + PLLD_BASE); + fence_udelay(1, clk_base); + + ovra =3D readl_relaxed(clk_base + LVL2_CLK_GATE_OVRA); + writel_relaxed(ovra | BIT(15), clk_base + LVL2_CLK_GATE_OVRA); + ovre =3D readl_relaxed(clk_base + LVL2_CLK_GATE_OVRE); + writel_relaxed(ovre | BIT(3), clk_base + LVL2_CLK_GATE_OVRE); + fence_udelay(1, clk_base); + + writel_relaxed(ovra, clk_base + LVL2_CLK_GATE_OVRA); + writel_relaxed(ovre, clk_base + LVL2_CLK_GATE_OVRE); + writel_relaxed(csi_src, clk_base + PLLD_BASE); + fence_udelay(1, clk_base); + + spin_unlock_irqrestore(&pll_d_lock, flags); +} + +static void tegra210_disp_mbist_war(struct tegra210_domain_mbist_war *mbis= t) +{ + u32 ovra, dsc_top_ctrl; + + ovra =3D readl_relaxed(clk_base + LVL2_CLK_GATE_OVRA); + writel_relaxed(ovra | BIT(1), clk_base + LVL2_CLK_GATE_OVRA); + fence_udelay(1, clk_base); + + dsc_top_ctrl =3D readl_relaxed(dispa_base + DC_COM_DSC_TOP_CTL); + writel_relaxed(dsc_top_ctrl | BIT(2), dispa_base + DC_COM_DSC_TOP_CTL); + readl_relaxed(dispa_base + DC_CMD_DISPLAY_COMMAND); + writel_relaxed(dsc_top_ctrl, dispa_base + DC_COM_DSC_TOP_CTL); + readl_relaxed(dispa_base + DC_CMD_DISPLAY_COMMAND); + + writel_relaxed(ovra, clk_base + LVL2_CLK_GATE_OVRA); + fence_udelay(1, clk_base); +} + +static void tegra210_vic_mbist_war(struct tegra210_domain_mbist_war *mbist) +{ + u32 ovre, val; + + ovre =3D readl_relaxed(clk_base + LVL2_CLK_GATE_OVRE); + writel_relaxed(ovre | BIT(5), clk_base + LVL2_CLK_GATE_OVRE); + fence_udelay(1, clk_base); + + val =3D readl_relaxed(vic_base + NV_PVIC_THI_SLCG_OVERRIDE_LOW); + writel_relaxed(val | BIT(0) | GENMASK(7, 2) | BIT(24), + vic_base + NV_PVIC_THI_SLCG_OVERRIDE_LOW); + fence_udelay(1, vic_base + NV_PVIC_THI_SLCG_OVERRIDE_LOW); + + writel_relaxed(val, vic_base + NV_PVIC_THI_SLCG_OVERRIDE_LOW); + readl(vic_base + NV_PVIC_THI_SLCG_OVERRIDE_LOW); + + writel_relaxed(ovre, clk_base + LVL2_CLK_GATE_OVRE); + fence_udelay(1, clk_base); +} + +static void tegra210_ape_mbist_war(struct tegra210_domain_mbist_war *mbist) +{ + void __iomem *i2s_base; + unsigned int i; + u32 ovrc, ovre; + + ovrc =3D readl_relaxed(clk_base + LVL2_CLK_GATE_OVRC); + ovre =3D readl_relaxed(clk_base + LVL2_CLK_GATE_OVRE); + writel_relaxed(ovrc | BIT(1), clk_base + LVL2_CLK_GATE_OVRC); + writel_relaxed(ovre | BIT(10) | BIT(11), + clk_base + LVL2_CLK_GATE_OVRE); + fence_udelay(1, clk_base); + + i2s_base =3D ahub_base + TEGRA210_I2S_BASE; + + for (i =3D 0; i < TEGRA210_I2S_CTRLS; i++) { + u32 i2s_ctrl; + + i2s_ctrl =3D readl_relaxed(i2s_base + TEGRA210_I2S_CTRL); + writel_relaxed(i2s_ctrl | BIT(10), + i2s_base + TEGRA210_I2S_CTRL); + writel_relaxed(0, i2s_base + TEGRA210_I2S_CG); + readl(i2s_base + TEGRA210_I2S_CG); + writel_relaxed(1, i2s_base + TEGRA210_I2S_CG); + writel_relaxed(i2s_ctrl, i2s_base + TEGRA210_I2S_CTRL); + readl(i2s_base + TEGRA210_I2S_CTRL); + + i2s_base +=3D TEGRA210_I2S_SIZE; + } + + writel_relaxed(ovrc, clk_base + LVL2_CLK_GATE_OVRC); + writel_relaxed(ovre, clk_base + LVL2_CLK_GATE_OVRE); + fence_udelay(1, clk_base); +} + +static inline void _pll_misc_chk_default(void __iomem *base, + struct tegra_clk_pll_params *params, + u8 misc_num, u32 default_val, u32 mask) +{ + u32 boot_val =3D readl_relaxed(base + params->ext_misc_reg[misc_num]); + + boot_val &=3D mask; + default_val &=3D mask; + if (boot_val !=3D default_val) { + pr_warn("boot misc%d 0x%x: expected 0x%x\n", + misc_num, boot_val, default_val); + pr_warn(" (comparison mask =3D 0x%x)\n", mask); + params->defaults_set =3D false; + } +} + +/* + * PLLCX: PLLC, PLLC2, PLLC3, PLLA1 + * Hybrid PLLs with dynamic ramp. Dynamic ramp is allowed for any transiti= on + * that changes NDIV only, while PLL is already locked. + */ +static void pllcx_check_defaults(struct tegra_clk_pll_params *params) +{ + u32 default_val; + + default_val =3D PLLCX_MISC0_DEFAULT_VALUE & (~PLLCX_MISC0_RESET); + _pll_misc_chk_default(clk_base, params, 0, default_val, + PLLCX_MISC0_WRITE_MASK); + + default_val =3D PLLCX_MISC1_DEFAULT_VALUE & (~PLLCX_MISC1_IDDQ); + _pll_misc_chk_default(clk_base, params, 1, default_val, + PLLCX_MISC1_WRITE_MASK); + + default_val =3D PLLCX_MISC2_DEFAULT_VALUE; + _pll_misc_chk_default(clk_base, params, 2, default_val, + PLLCX_MISC2_WRITE_MASK); + + default_val =3D PLLCX_MISC3_DEFAULT_VALUE; + _pll_misc_chk_default(clk_base, params, 3, default_val, + PLLCX_MISC3_WRITE_MASK); +} + +static void tegra210_pllcx_set_defaults(const char *name, + struct tegra_clk_pll *pllcx) +{ + pllcx->params->defaults_set =3D true; + + if (readl_relaxed(clk_base + pllcx->params->base_reg) & PLL_ENABLE && + !pllcx->params->defaults_set) { + /* PLL is ON: only check if defaults already set */ + pllcx_check_defaults(pllcx->params); + if (!pllcx->params->defaults_set) + pr_warn("%s already enabled. Postponing set full defaults\n", + name); + return; + } + + /* Defaults assert PLL reset, and set IDDQ */ + writel_relaxed(PLLCX_MISC0_DEFAULT_VALUE, + clk_base + pllcx->params->ext_misc_reg[0]); + writel_relaxed(PLLCX_MISC1_DEFAULT_VALUE, + clk_base + pllcx->params->ext_misc_reg[1]); + writel_relaxed(PLLCX_MISC2_DEFAULT_VALUE, + clk_base + pllcx->params->ext_misc_reg[2]); + writel_relaxed(PLLCX_MISC3_DEFAULT_VALUE, + clk_base + pllcx->params->ext_misc_reg[3]); + udelay(1); +} + +static void _pllc_set_defaults(struct tegra_clk_pll *pllcx) +{ + tegra210_pllcx_set_defaults("PLL_C", pllcx); +} + +static void _pllc2_set_defaults(struct tegra_clk_pll *pllcx) +{ + tegra210_pllcx_set_defaults("PLL_C2", pllcx); +} + +static void _pllc3_set_defaults(struct tegra_clk_pll *pllcx) +{ + tegra210_pllcx_set_defaults("PLL_C3", pllcx); +} + +static void _plla1_set_defaults(struct tegra_clk_pll *pllcx) +{ + tegra210_pllcx_set_defaults("PLL_A1", pllcx); +} + +/* + * PLLA + * PLL with dynamic ramp and fractional SDM. Dynamic ramp is not used. + * Fractional SDM is allowed to provide exact audio rates. + */ +static void tegra210_plla_set_defaults(struct tegra_clk_pll *plla) +{ + u32 mask; + u32 val =3D readl_relaxed(clk_base + plla->params->base_reg); + + plla->params->defaults_set =3D true; + + if (val & PLL_ENABLE) { + /* + * PLL is ON: check if defaults already set, then set those + * that can be updated in flight. + */ + if (val & PLLA_BASE_IDDQ) { + pr_warn("PLL_A boot enabled with IDDQ set\n"); + plla->params->defaults_set =3D false; + } + + pr_warn("PLL_A already enabled. Postponing set full defaults\n"); + + val =3D PLLA_MISC0_DEFAULT_VALUE; /* ignore lock enable */ + mask =3D PLLA_MISC0_LOCK_ENABLE | PLLA_MISC0_LOCK_OVERRIDE; + _pll_misc_chk_default(clk_base, plla->params, 0, val, + ~mask & PLLA_MISC0_WRITE_MASK); + + val =3D PLLA_MISC2_DEFAULT_VALUE; /* ignore all but control bit */ + _pll_misc_chk_default(clk_base, plla->params, 2, val, + PLLA_MISC2_EN_DYNRAMP); + + val =3D readl_relaxed(clk_base + PLLA_OUT) & PLLA_OUT_VREG_MASK; + if (val !=3D PLLA_OUT_DEFAULT_VALUE) { + pr_warn("boot PLL_A vreg 0x%x: expected 0x%x\n", + val, PLLA_OUT_DEFAULT_VALUE); + plla->params->defaults_set =3D false; + } + + /* Enable lock detect */ + val =3D readl_relaxed(clk_base + plla->params->ext_misc_reg[0]); + val &=3D ~mask; + val |=3D PLLA_MISC0_DEFAULT_VALUE & mask; + writel_relaxed(val, clk_base + plla->params->ext_misc_reg[0]); + udelay(1); + + if (!plla->params->defaults_set) + pr_warn("PLL_A already enabled. Postponing set full defaults\n"); + + return; + } + + /* set IDDQ, enable lock detect, disable dynamic ramp and SDM */ + val |=3D PLLA_BASE_IDDQ; + writel_relaxed(val, clk_base + plla->params->base_reg); + writel_relaxed(PLLA_MISC0_DEFAULT_VALUE, + clk_base + plla->params->ext_misc_reg[0]); + writel_relaxed(PLLA_MISC2_DEFAULT_VALUE, + clk_base + plla->params->ext_misc_reg[2]); + val =3D readl_relaxed(clk_base + PLLA_OUT) & (~PLLA_OUT_VREG_MASK); + writel_relaxed(val | PLLA_OUT_DEFAULT_VALUE, clk_base + PLLA_OUT); + udelay(1); +} + +/* + * PLLD + * PLL with fractional SDM. + */ +static void tegra210_plld_set_defaults(struct tegra_clk_pll *plld) +{ + u32 val; + u32 mask =3D 0xffff; + + plld->params->defaults_set =3D true; + + if (readl_relaxed(clk_base + plld->params->base_reg) & + PLL_ENABLE) { + + /* + * PLL is ON: check if defaults already set, then set those + * that can be updated in flight. + */ + val =3D PLLD_MISC1_DEFAULT_VALUE; + _pll_misc_chk_default(clk_base, plld->params, 1, + val, PLLD_MISC1_WRITE_MASK); + + /* ignore lock, DSI and SDM controls, make sure IDDQ not set */ + val =3D PLLD_MISC0_DEFAULT_VALUE & (~PLLD_MISC0_IDDQ); + mask |=3D PLLD_MISC0_DSI_CLKENABLE | PLLD_MISC0_LOCK_ENABLE | + PLLD_MISC0_LOCK_OVERRIDE | PLLD_MISC0_EN_SDM; + _pll_misc_chk_default(clk_base, plld->params, 0, val, + ~mask & PLLD_MISC0_WRITE_MASK); + + if (!plld->params->defaults_set) + pr_warn("PLL_D already enabled. Postponing set full defaults\n"); + + /* Enable lock detect */ + mask =3D PLLD_MISC0_LOCK_ENABLE | PLLD_MISC0_LOCK_OVERRIDE; + val =3D readl_relaxed(clk_base + plld->params->ext_misc_reg[0]); + val &=3D ~mask; + val |=3D PLLD_MISC0_DEFAULT_VALUE & mask; + writel_relaxed(val, clk_base + plld->params->ext_misc_reg[0]); + udelay(1); + + return; + } + + val =3D readl_relaxed(clk_base + plld->params->ext_misc_reg[0]); + val &=3D PLLD_MISC0_DSI_CLKENABLE; + val |=3D PLLD_MISC0_DEFAULT_VALUE; + /* set IDDQ, enable lock detect, disable SDM */ + writel_relaxed(val, clk_base + plld->params->ext_misc_reg[0]); + writel_relaxed(PLLD_MISC1_DEFAULT_VALUE, clk_base + + plld->params->ext_misc_reg[1]); + udelay(1); +} + +/* + * PLLD2, PLLDP + * PLL with fractional SDM and Spread Spectrum (SDM is a must if SSC is us= ed). + */ +static void plldss_defaults(const char *pll_name, struct tegra_clk_pll *pl= ldss, + u32 misc0_val, u32 misc1_val, u32 misc2_val, u32 misc3_val, + u32 misc4_val) +{ + u32 default_val; + u32 val =3D readl_relaxed(clk_base + plldss->params->base_reg); + + plldss->params->defaults_set =3D true; + + if (val & PLL_ENABLE) { + + /* + * PLL is ON: check if defaults already set, then set those + * that can be updated in flight. + */ + if (val & PLLDSS_BASE_IDDQ) { + pr_warn("plldss boot enabled with IDDQ set\n"); + plldss->params->defaults_set =3D false; + } + + /* ignore lock enable */ + default_val =3D misc0_val; + _pll_misc_chk_default(clk_base, plldss->params, 0, default_val, + PLLDSS_MISC0_WRITE_MASK & + (~PLLDSS_MISC0_LOCK_ENABLE)); + + /* + * If SSC is used, check all settings, otherwise just confirm + * that SSC is not used on boot as well. Do nothing when using + * this function for PLLC4 that has only MISC0. + */ + if (plldss->params->ssc_ctrl_en_mask) { + default_val =3D misc1_val; + _pll_misc_chk_default(clk_base, plldss->params, 1, + default_val, PLLDSS_MISC1_CFG_WRITE_MASK); + default_val =3D misc2_val; + _pll_misc_chk_default(clk_base, plldss->params, 2, + default_val, PLLDSS_MISC2_CTRL1_WRITE_MASK); + default_val =3D misc3_val; + _pll_misc_chk_default(clk_base, plldss->params, 3, + default_val, PLLDSS_MISC3_CTRL2_WRITE_MASK); + } else if (plldss->params->ext_misc_reg[1]) { + default_val =3D misc1_val; + _pll_misc_chk_default(clk_base, plldss->params, 1, + default_val, PLLDSS_MISC1_CFG_WRITE_MASK & + (~PLLDSS_MISC1_CFG_EN_SDM)); + } + + default_val =3D misc4_val; + _pll_misc_chk_default(clk_base, plldss->params, 4, + default_val, PLLDSS_MISC4_VREG_WRITE_MASK); + + if (!plldss->params->defaults_set) + pr_warn("%s already enabled. Postponing set full defaults\n", + pll_name); + + /* Enable lock detect */ + if (val & PLLDSS_BASE_LOCK_OVERRIDE) { + val &=3D ~PLLDSS_BASE_LOCK_OVERRIDE; + writel_relaxed(val, clk_base + + plldss->params->base_reg); + } + + val =3D readl_relaxed(clk_base + plldss->params->ext_misc_reg[0]); + val &=3D ~PLLDSS_MISC0_LOCK_ENABLE; + val |=3D misc0_val & PLLDSS_MISC0_LOCK_ENABLE; + writel_relaxed(val, clk_base + plldss->params->ext_misc_reg[0]); + udelay(1); + + return; + } + + /* set IDDQ, enable lock detect, configure SDM/SSC */ + val |=3D PLLDSS_BASE_IDDQ; + val &=3D ~PLLDSS_BASE_LOCK_OVERRIDE; + writel_relaxed(val, clk_base + plldss->params->base_reg); + + writel_relaxed(misc0_val, clk_base + + plldss->params->ext_misc_reg[0]); + /* if SSC used set by 1st enable */ + writel_relaxed(misc1_val & (~PLLDSS_MISC1_CFG_EN_SSC), + clk_base + plldss->params->ext_misc_reg[1]); + writel_relaxed(misc2_val, clk_base + plldss->params->ext_misc_reg[2]); + writel_relaxed(misc3_val, clk_base + plldss->params->ext_misc_reg[3]); + writel_relaxed(misc4_val, clk_base + plldss->params->ext_misc_reg[4]); + udelay(1); +} + +static void tegra210_plld2_set_defaults(struct tegra_clk_pll *plld2) +{ + plldss_defaults("PLL_D2", plld2, PLLD2_MISC0_DEFAULT_VALUE, + PLLD2_MISC1_CFG_DEFAULT_VALUE, + PLLD2_MISC2_CTRL1_DEFAULT_VALUE, + PLLD2_MISC3_CTRL2_DEFAULT_VALUE, + PLLD2_MISC4_VREG_DEFAULT_VALUE); +} + +static void tegra210_plldp_set_defaults(struct tegra_clk_pll *plldp) +{ + plldss_defaults("PLL_DP", plldp, PLLDP_MISC0_DEFAULT_VALUE, + PLLDP_MISC1_CFG_DEFAULT_VALUE, + PLLDP_MISC2_CTRL1_DEFAULT_VALUE, + PLLDP_MISC3_CTRL2_DEFAULT_VALUE, + PLLDP_MISC4_VREG_DEFAULT_VALUE); +} + +/* + * PLLC4 + * Base and misc0 layout is the same as PLLD2/PLLDP, but no SDM/SSC suppor= t. + * VCO is exposed to the clock tree via fixed 1/3 and 1/5 dividers. + */ +static void tegra210_pllc4_set_defaults(struct tegra_clk_pll *pllc4) +{ + u32 default_val; + u32 val =3D readl_relaxed(clk_base + pllc4->params->base_reg); + + pllc4->params->defaults_set =3D true; + + if (val & PLL_ENABLE) { + /* + * PLL is ON: check if defaults already set, then set those + * that can be updated in flight. + */ + if (val & PLLDSS_BASE_IDDQ) { + pr_warn("PLL_C4 boot enabled with IDDQ set\n"); + pllc4->params->defaults_set =3D false; + } + + /* ignore lock enable */ + default_val =3D PLLC4_MISC0_DEFAULT_VALUE; + _pll_misc_chk_default(clk_base, pllc4->params, 0, default_val, + PLLDSS_MISC0_WRITE_MASK & + (~PLLDSS_MISC0_LOCK_ENABLE)); + + val =3D readl_relaxed(clk_base + PLLC4_OUT) & PLLC4_OUT_VREG_MASK; + if (val !=3D PLLC4_OUT_DEFAULT_VALUE) { + pr_warn("boot PLL_C4 vreg 0x%x: expected 0x%x\n", + val, PLLC4_OUT_DEFAULT_VALUE); + pllc4->params->defaults_set =3D false; + } + + /* Enable lock detect */ + if (val & PLLDSS_BASE_LOCK_OVERRIDE) { + val &=3D ~PLLDSS_BASE_LOCK_OVERRIDE; + writel_relaxed(val, clk_base + pllc4->params->base_reg); + } + + val =3D readl_relaxed(clk_base + pllc4->params->ext_misc_reg[0]); + val &=3D ~PLLDSS_MISC0_LOCK_ENABLE; + val |=3D PLLC4_MISC0_DEFAULT_VALUE & PLLDSS_MISC0_LOCK_ENABLE; + writel_relaxed(val, clk_base + pllc4->params->ext_misc_reg[0]); + fence_udelay(1, clk_base); + + if (!pllc4->params->defaults_set) + pr_warn("PLL_C4 already enabled. Postponing set full defaults\n"); + + return; + } + + /* set IDDQ, enable lock detect */ + val |=3D PLLDSS_BASE_IDDQ; + val &=3D ~PLLDSS_BASE_LOCK_OVERRIDE; + writel_relaxed(val, clk_base + pllc4->params->base_reg); + writel_relaxed(PLLC4_MISC0_DEFAULT_VALUE, + clk_base + pllc4->params->ext_misc_reg[0]); + val =3D readl_relaxed(clk_base + PLLC4_OUT) & (~PLLC4_OUT_VREG_MASK); + writel_relaxed(val | PLLC4_OUT_DEFAULT_VALUE, clk_base + PLLC4_OUT); + fence_udelay(1, clk_base); +} + +/* + * PLLRE + * VCO is exposed to the clock tree directly along with post-divider output + */ +static void tegra210_pllre_set_defaults(struct tegra_clk_pll *pllre) +{ + u32 mask; + u32 val =3D readl_relaxed(clk_base + pllre->params->base_reg); + + pllre->params->defaults_set =3D true; + + if (val & PLL_ENABLE) { + /* + * PLL is ON: check if defaults already set, then set those + * that can be updated in flight. + */ + val &=3D PLLRE_BASE_DEFAULT_MASK; + if (val !=3D PLLRE_BASE_DEFAULT_VALUE) { + pr_warn("pllre boot base 0x%x : expected 0x%x\n", + val, PLLRE_BASE_DEFAULT_VALUE); + pr_warn("(comparison mask =3D 0x%x)\n", + PLLRE_BASE_DEFAULT_MASK); + pllre->params->defaults_set =3D false; + } + + val =3D readl_relaxed(clk_base + PLLRE_OUT1) & + PLLRE_OUT1_VREG_MASK; + if (val !=3D PLLRE_OUT1_DEFAULT_VALUE) { + pr_warn("boot PLLRE vreg 0x%x: expected 0x%x\n", + val, PLLRE_OUT1_DEFAULT_VALUE); + pllre->params->defaults_set =3D false; + } + + /* Ignore lock enable */ + val =3D PLLRE_MISC0_DEFAULT_VALUE & (~PLLRE_MISC0_IDDQ); + mask =3D PLLRE_MISC0_LOCK_ENABLE | PLLRE_MISC0_LOCK_OVERRIDE; + _pll_misc_chk_default(clk_base, pllre->params, 0, val, + ~mask & PLLRE_MISC0_WRITE_MASK); + + /* Enable lock detect */ + val =3D readl_relaxed(clk_base + pllre->params->ext_misc_reg[0]); + val &=3D ~mask; + val |=3D PLLRE_MISC0_DEFAULT_VALUE & mask; + writel_relaxed(val, clk_base + pllre->params->ext_misc_reg[0]); + val =3D readl_relaxed(clk_base + PLLRE_OUT1) & + (~PLLRE_OUT1_VREG_MASK); + writel_relaxed(val | PLLRE_OUT1_DEFAULT_VALUE, + clk_base + PLLRE_OUT1); + udelay(1); + + if (!pllre->params->defaults_set) + pr_warn("PLL_RE already enabled. Postponing set full defaults\n"); + + return; + } + + /* set IDDQ, enable lock detect */ + val &=3D ~PLLRE_BASE_DEFAULT_MASK; + val |=3D PLLRE_BASE_DEFAULT_VALUE & PLLRE_BASE_DEFAULT_MASK; + writel_relaxed(val, clk_base + pllre->params->base_reg); + writel_relaxed(PLLRE_MISC0_DEFAULT_VALUE, + clk_base + pllre->params->ext_misc_reg[0]); + udelay(1); +} + +static void pllx_get_dyn_steps(struct clk_hw *hw, u32 *step_a, u32 *step_b) +{ + unsigned long input_rate; + + /* cf rate */ + if (!IS_ERR_OR_NULL(hw->clk)) + input_rate =3D clk_hw_get_rate(clk_hw_get_parent(hw)); + else + input_rate =3D 38400000; + + input_rate /=3D tegra_pll_get_fixed_mdiv(hw, input_rate); + + switch (input_rate) { + case 12000000: + case 12800000: + case 13000000: + *step_a =3D 0x2B; + *step_b =3D 0x0B; + return; + case 19200000: + *step_a =3D 0x12; + *step_b =3D 0x08; + return; + case 38400000: + *step_a =3D 0x04; + *step_b =3D 0x05; + return; + default: + pr_err("%s: Unexpected reference rate %lu\n", + __func__, input_rate); + BUG(); + } +} + +static void pllx_check_defaults(struct tegra_clk_pll *pll) +{ + u32 default_val; + + default_val =3D PLLX_MISC0_DEFAULT_VALUE; + /* ignore lock enable */ + _pll_misc_chk_default(clk_base, pll->params, 0, default_val, + PLLX_MISC0_WRITE_MASK & (~PLLX_MISC0_LOCK_ENABLE)); + + default_val =3D PLLX_MISC1_DEFAULT_VALUE; + _pll_misc_chk_default(clk_base, pll->params, 1, default_val, + PLLX_MISC1_WRITE_MASK); + + /* ignore all but control bit */ + default_val =3D PLLX_MISC2_DEFAULT_VALUE; + _pll_misc_chk_default(clk_base, pll->params, 2, + default_val, PLLX_MISC2_EN_DYNRAMP); + + default_val =3D PLLX_MISC3_DEFAULT_VALUE & (~PLLX_MISC3_IDDQ); + _pll_misc_chk_default(clk_base, pll->params, 3, default_val, + PLLX_MISC3_WRITE_MASK); + + default_val =3D PLLX_MISC4_DEFAULT_VALUE; + _pll_misc_chk_default(clk_base, pll->params, 4, default_val, + PLLX_MISC4_WRITE_MASK); + + default_val =3D PLLX_MISC5_DEFAULT_VALUE; + _pll_misc_chk_default(clk_base, pll->params, 5, default_val, + PLLX_MISC5_WRITE_MASK); +} + +static void tegra210_pllx_set_defaults(struct tegra_clk_pll *pllx) +{ + u32 val; + u32 step_a, step_b; + + pllx->params->defaults_set =3D true; + + /* Get ready dyn ramp state machine settings */ + pllx_get_dyn_steps(&pllx->hw, &step_a, &step_b); + val =3D PLLX_MISC2_DEFAULT_VALUE & (~PLLX_MISC2_DYNRAMP_STEPA_MASK) & + (~PLLX_MISC2_DYNRAMP_STEPB_MASK); + val |=3D step_a << PLLX_MISC2_DYNRAMP_STEPA_SHIFT; + val |=3D step_b << PLLX_MISC2_DYNRAMP_STEPB_SHIFT; + + if (readl_relaxed(clk_base + pllx->params->base_reg) & PLL_ENABLE) { + + /* + * PLL is ON: check if defaults already set, then set those + * that can be updated in flight. + */ + pllx_check_defaults(pllx); + + if (!pllx->params->defaults_set) + pr_warn("PLL_X already enabled. Postponing set full defaults\n"); + /* Configure dyn ramp, disable lock override */ + writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[2]); + + /* Enable lock detect */ + val =3D readl_relaxed(clk_base + pllx->params->ext_misc_reg[0]); + val &=3D ~PLLX_MISC0_LOCK_ENABLE; + val |=3D PLLX_MISC0_DEFAULT_VALUE & PLLX_MISC0_LOCK_ENABLE; + writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[0]); + udelay(1); + + return; + } + + /* Enable lock detect and CPU output */ + writel_relaxed(PLLX_MISC0_DEFAULT_VALUE, clk_base + + pllx->params->ext_misc_reg[0]); + + /* Setup */ + writel_relaxed(PLLX_MISC1_DEFAULT_VALUE, clk_base + + pllx->params->ext_misc_reg[1]); + + /* Configure dyn ramp state machine, disable lock override */ + writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[2]); + + /* Set IDDQ */ + writel_relaxed(PLLX_MISC3_DEFAULT_VALUE, clk_base + + pllx->params->ext_misc_reg[3]); + + /* Disable SDM */ + writel_relaxed(PLLX_MISC4_DEFAULT_VALUE, clk_base + + pllx->params->ext_misc_reg[4]); + writel_relaxed(PLLX_MISC5_DEFAULT_VALUE, clk_base + + pllx->params->ext_misc_reg[5]); + udelay(1); +} + +/* + * PLLP + * VCO is exposed to the clock tree directly along with post-divider outpu= t. + * Both VCO and post-divider output rates are fixed at 408MHz and 204MHz, + * respectively. + */ +static void pllp_check_defaults(struct tegra_clk_pll *pll, bool enabled) +{ + u32 val, mask; + + /* Ignore lock enable (will be set), make sure not in IDDQ if enabled */ + val =3D PLLP_MISC0_DEFAULT_VALUE & (~PLLP_MISC0_IDDQ); + mask =3D PLLP_MISC0_LOCK_ENABLE | PLLP_MISC0_LOCK_OVERRIDE; + if (!enabled) + mask |=3D PLLP_MISC0_IDDQ; + _pll_misc_chk_default(clk_base, pll->params, 0, val, + ~mask & PLLP_MISC0_WRITE_MASK); + + /* Ignore branch controls */ + val =3D PLLP_MISC1_DEFAULT_VALUE; + mask =3D PLLP_MISC1_HSIO_EN | PLLP_MISC1_XUSB_EN; + _pll_misc_chk_default(clk_base, pll->params, 1, val, + ~mask & PLLP_MISC1_WRITE_MASK); +} + +static void tegra210_pllp_set_defaults(struct tegra_clk_pll *pllp) +{ + u32 mask; + u32 val =3D readl_relaxed(clk_base + pllp->params->base_reg); + + /* Disable in h/w pll_p_out1 that is not routed to any module */ + writel_relaxed(0, clk_base + PLLP_OUTA); + + pllp->params->defaults_set =3D true; + + if (val & PLL_ENABLE) { + + /* + * PLL is ON: check if defaults already set, then set those + * that can be updated in flight. + */ + pllp_check_defaults(pllp, true); + if (!pllp->params->defaults_set) + pr_warn("PLL_P already enabled. Postponing set full defaults\n"); + + /* Enable lock detect */ + val =3D readl_relaxed(clk_base + pllp->params->ext_misc_reg[0]); + mask =3D PLLP_MISC0_LOCK_ENABLE | PLLP_MISC0_LOCK_OVERRIDE; + val &=3D ~mask; + val |=3D PLLP_MISC0_DEFAULT_VALUE & mask; + writel_relaxed(val, clk_base + pllp->params->ext_misc_reg[0]); + udelay(1); + + return; + } + + /* set IDDQ, enable lock detect */ + writel_relaxed(PLLP_MISC0_DEFAULT_VALUE, + clk_base + pllp->params->ext_misc_reg[0]); + + /* Preserve branch control */ + val =3D readl_relaxed(clk_base + pllp->params->ext_misc_reg[1]); + mask =3D PLLP_MISC1_HSIO_EN | PLLP_MISC1_XUSB_EN; + val &=3D mask; + val |=3D ~mask & PLLP_MISC1_DEFAULT_VALUE; + writel_relaxed(val, clk_base + pllp->params->ext_misc_reg[1]); + udelay(1); +} + +/* + * PLLU + * VCO is exposed to the clock tree directly along with post-divider outpu= t. + * Both VCO and post-divider output rates are fixed at 480MHz and 240MHz, + * respectively. + */ +static void pllu_check_defaults(struct tegra_clk_pll_params *params, + bool hw_control) +{ + u32 val, mask; + + /* Ignore lock enable (will be set) and IDDQ if under h/w control */ + val =3D PLLU_MISC0_DEFAULT_VALUE & (~PLLU_MISC0_IDDQ); + mask =3D PLLU_MISC0_LOCK_ENABLE | (hw_control ? PLLU_MISC0_IDDQ : 0); + _pll_misc_chk_default(clk_base, params, 0, val, + ~mask & PLLU_MISC0_WRITE_MASK); + + val =3D PLLU_MISC1_DEFAULT_VALUE; + mask =3D PLLU_MISC1_LOCK_OVERRIDE; + _pll_misc_chk_default(clk_base, params, 1, val, + ~mask & PLLU_MISC1_WRITE_MASK); +} + +static void tegra210_pllu_set_defaults(struct tegra_clk_pll_params *pllu) +{ + u32 val =3D readl_relaxed(clk_base + pllu->base_reg); + + pllu->defaults_set =3D true; + + if (val & PLL_ENABLE) { + + /* + * PLL is ON: check if defaults already set, then set those + * that can be updated in flight. + */ + pllu_check_defaults(pllu, false); + if (!pllu->defaults_set) + pr_warn("PLL_U already enabled. Postponing set full defaults\n"); + + /* Enable lock detect */ + val =3D readl_relaxed(clk_base + pllu->ext_misc_reg[0]); + val &=3D ~PLLU_MISC0_LOCK_ENABLE; + val |=3D PLLU_MISC0_DEFAULT_VALUE & PLLU_MISC0_LOCK_ENABLE; + writel_relaxed(val, clk_base + pllu->ext_misc_reg[0]); + + val =3D readl_relaxed(clk_base + pllu->ext_misc_reg[1]); + val &=3D ~PLLU_MISC1_LOCK_OVERRIDE; + val |=3D PLLU_MISC1_DEFAULT_VALUE & PLLU_MISC1_LOCK_OVERRIDE; + writel_relaxed(val, clk_base + pllu->ext_misc_reg[1]); + udelay(1); + + return; + } + + /* set IDDQ, enable lock detect */ + writel_relaxed(PLLU_MISC0_DEFAULT_VALUE, + clk_base + pllu->ext_misc_reg[0]); + writel_relaxed(PLLU_MISC1_DEFAULT_VALUE, + clk_base + pllu->ext_misc_reg[1]); + udelay(1); +} + +#define mask(w) ((1 << (w)) - 1) +#define divm_mask(p) mask(p->params->div_nmp->divm_width) +#define divn_mask(p) mask(p->params->div_nmp->divn_width) +#define divp_mask(p) mask(p->params->div_nmp->divp_width) + +#define divm_shift(p) ((p)->params->div_nmp->divm_shift) +#define divn_shift(p) ((p)->params->div_nmp->divn_shift) +#define divp_shift(p) ((p)->params->div_nmp->divp_shift) + +#define divm_mask_shifted(p) (divm_mask(p) << divm_shift(p)) +#define divn_mask_shifted(p) (divn_mask(p) << divn_shift(p)) +#define divp_mask_shifted(p) (divp_mask(p) << divp_shift(p)) + +#define PLL_LOCKDET_DELAY 2 /* Lock detection safety delays */ +static int tegra210_wait_for_mask(struct tegra_clk_pll *pll, + u32 reg, u32 mask) +{ + int i; + u32 val =3D 0; + + for (i =3D 0; i < pll->params->lock_delay / PLL_LOCKDET_DELAY + 1; i++) { + udelay(PLL_LOCKDET_DELAY); + val =3D readl_relaxed(clk_base + reg); + if ((val & mask) =3D=3D mask) { + udelay(PLL_LOCKDET_DELAY); + return 0; + } + } + return -ETIMEDOUT; +} + +static int tegra210_pllx_dyn_ramp(struct tegra_clk_pll *pllx, + struct tegra_clk_pll_freq_table *cfg) +{ + u32 val, base, ndiv_new_mask; + + ndiv_new_mask =3D (divn_mask(pllx) >> pllx->params->div_nmp->divn_shift) + << PLLX_MISC2_NDIV_NEW_SHIFT; + + val =3D readl_relaxed(clk_base + pllx->params->ext_misc_reg[2]); + val &=3D (~ndiv_new_mask); + val |=3D cfg->n << PLLX_MISC2_NDIV_NEW_SHIFT; + writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[2]); + udelay(1); + + val =3D readl_relaxed(clk_base + pllx->params->ext_misc_reg[2]); + val |=3D PLLX_MISC2_EN_DYNRAMP; + writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[2]); + udelay(1); + + tegra210_wait_for_mask(pllx, pllx->params->ext_misc_reg[2], + PLLX_MISC2_DYNRAMP_DONE); + + base =3D readl_relaxed(clk_base + pllx->params->base_reg) & + (~divn_mask_shifted(pllx)); + base |=3D cfg->n << pllx->params->div_nmp->divn_shift; + writel_relaxed(base, clk_base + pllx->params->base_reg); + udelay(1); + + val &=3D ~PLLX_MISC2_EN_DYNRAMP; + writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[2]); + udelay(1); + + pr_debug("%s: dynamic ramp to m =3D %u n =3D %u p =3D %u, Fout =3D %lu kH= z\n", + __clk_get_name(pllx->hw.clk), cfg->m, cfg->n, cfg->p, + cfg->input_rate / cfg->m * cfg->n / + pllx->params->pdiv_tohw[cfg->p].pdiv / 1000); + + return 0; +} + +/* + * UTMIPLL + * Running at fixed 960MHz rate with fixed 1:2 factor 480MHz output suppli= ed + * to USB link (not exposed to clock tree), and fixed 1:16 factor 60MHz su= pplied + * to PLL_RE (exposed to clock tree). + */ +static int utmipll_set_defaults(bool locked) +{ + u32 val =3D readl_relaxed(clk_base + UTMIP_PLL_CFG0); + + if (locked) + return (val & UTMIP_PLL_CFG0_WRITE_MASK) =3D=3D + UTMIP_PLL_CFG0_DEFAULT_VALUE ? 0 : -EINVAL; + + writel_relaxed(UTMIP_PLL_CFG0_DEFAULT_VALUE, + clk_base + UTMIP_PLL_CFG0); + fence_udelay(1, clk_base); + + return 0; +} + +/* + * Common configuration for PLLs with fixed input divider policy: + * - always set fixed M-value based on the reference rate + * - always set P-value value 1:1 for output rates above VCO minimum, and + * choose minimum necessary P-value for output rates below VCO maximum + * - calculate N-value based on selected M and P + * - calculate SDM_DIN fractional part + */ +static int tegra210_pll_fixed_mdiv_cfg(struct clk_hw *hw, + struct tegra_clk_pll_freq_table *cfg, + unsigned long rate, unsigned long input_rate) +{ + struct tegra_clk_pll *pll =3D to_clk_pll(hw); + struct tegra_clk_pll_params *params =3D pll->params; + int p; + unsigned long cf, p_rate; + u32 pdiv; + + if (!rate) + return -EINVAL; + + if (!(params->flags & TEGRA_PLL_VCO_OUT)) { + p =3D DIV_ROUND_UP(params->vco_min, rate); + p =3D params->round_p_to_pdiv(p, &pdiv); + } else { + p =3D rate >=3D params->vco_min ? 1 : -EINVAL; + } + + if (p < 0) + return -EINVAL; + + cfg->m =3D tegra_pll_get_fixed_mdiv(hw, input_rate); + cfg->p =3D p; + + /* Store P as HW value, as that is what is expected */ + cfg->p =3D tegra_pll_p_div_to_hw(pll, cfg->p); + + p_rate =3D rate * p; + if (p_rate > params->vco_max) + p_rate =3D params->vco_max; + cf =3D input_rate / cfg->m; + cfg->n =3D p_rate / cf; + + cfg->sdm_data =3D 0; + cfg->output_rate =3D input_rate; + if (params->sdm_ctrl_reg) { + unsigned long rem =3D p_rate - cf * cfg->n; + /* If ssc is enabled SDM enabled as well, even for integer n */ + if (rem || params->ssc_ctrl_reg) { + u64 s =3D rem * PLL_SDM_COEFF; + + do_div(s, cf); + s -=3D PLL_SDM_COEFF / 2; + cfg->sdm_data =3D sdin_din_to_data(s); + } + cfg->output_rate *=3D sdin_get_n_eff(cfg); + cfg->output_rate /=3D p * cfg->m * PLL_SDM_COEFF; + } else { + cfg->output_rate *=3D cfg->n; + cfg->output_rate /=3D p * cfg->m; + } + + cfg->input_rate =3D input_rate; + + return 0; +} + +/* + * clk_pll_set_gain - set gain to m, n to calculate correct VCO rate + * + * @cfg: struct tegra_clk_pll_freq_table * cfg + * + * For Normal mode: + * Fvco =3D Fref * NDIV / MDIV + * + * For fractional mode: + * Fvco =3D Fref * (NDIV + 0.5 + SDM_DIN / PLL_SDM_COEFF) / MDIV + */ +static void tegra210_clk_pll_set_gain(struct tegra_clk_pll_freq_table *cfg) +{ + cfg->n =3D sdin_get_n_eff(cfg); + cfg->m *=3D PLL_SDM_COEFF; +} + +static unsigned long +tegra210_clk_adjust_vco_min(struct tegra_clk_pll_params *params, + unsigned long parent_rate) +{ + unsigned long vco_min =3D params->vco_min; + + params->vco_min +=3D DIV_ROUND_UP(parent_rate, PLL_SDM_COEFF); + vco_min =3D min(vco_min, params->vco_min); + + return vco_min; +} + +static struct div_nmp pllx_nmp =3D { + .divm_shift =3D 0, + .divm_width =3D 8, + .divn_shift =3D 8, + .divn_width =3D 8, + .divp_shift =3D 20, + .divp_width =3D 5, +}; +/* + * PLL post divider maps - two types: quasi-linear and exponential + * post divider. + */ +#define PLL_QLIN_PDIV_MAX 16 +static const struct pdiv_map pll_qlin_pdiv_to_hw[] =3D { + { .pdiv =3D 1, .hw_val =3D 0 }, + { .pdiv =3D 2, .hw_val =3D 1 }, + { .pdiv =3D 3, .hw_val =3D 2 }, + { .pdiv =3D 4, .hw_val =3D 3 }, + { .pdiv =3D 5, .hw_val =3D 4 }, + { .pdiv =3D 6, .hw_val =3D 5 }, + { .pdiv =3D 8, .hw_val =3D 6 }, + { .pdiv =3D 9, .hw_val =3D 7 }, + { .pdiv =3D 10, .hw_val =3D 8 }, + { .pdiv =3D 12, .hw_val =3D 9 }, + { .pdiv =3D 15, .hw_val =3D 10 }, + { .pdiv =3D 16, .hw_val =3D 11 }, + { .pdiv =3D 18, .hw_val =3D 12 }, + { .pdiv =3D 20, .hw_val =3D 13 }, + { .pdiv =3D 24, .hw_val =3D 14 }, + { .pdiv =3D 30, .hw_val =3D 15 }, + { .pdiv =3D 31, .hw_val =3D 16 }, + { .pdiv =3D 0, }, +}; + +static u32 pll_qlin_p_to_pdiv(u32 p, u32 *pdiv) +{ + int i; + + if (p) { + for (i =3D 0; i <=3D PLL_QLIN_PDIV_MAX; i++) { + if (p <=3D pll_qlin_pdiv_to_hw[i].pdiv) { + if (pdiv) + *pdiv =3D i; + return pll_qlin_pdiv_to_hw[i].pdiv; + } + } + } + + return -EINVAL; +} + +#define PLL_EXPO_PDIV_MAX 7 +static const struct pdiv_map pll_expo_pdiv_to_hw[] =3D { + { .pdiv =3D 1, .hw_val =3D 0 }, + { .pdiv =3D 2, .hw_val =3D 1 }, + { .pdiv =3D 4, .hw_val =3D 2 }, + { .pdiv =3D 8, .hw_val =3D 3 }, + { .pdiv =3D 16, .hw_val =3D 4 }, + { .pdiv =3D 32, .hw_val =3D 5 }, + { .pdiv =3D 64, .hw_val =3D 6 }, + { .pdiv =3D 128, .hw_val =3D 7 }, + { .pdiv =3D 0, }, +}; + +static u32 pll_expo_p_to_pdiv(u32 p, u32 *pdiv) +{ + if (p) { + u32 i =3D fls(p); + + if (i =3D=3D ffs(p)) + i--; + + if (i <=3D PLL_EXPO_PDIV_MAX) { + if (pdiv) + *pdiv =3D i; + return 1 << i; + } + } + return -EINVAL; +} + +static struct tegra_clk_pll_freq_table pll_x_freq_table[] =3D { + /* 1 GHz */ + { 38400000, 1000000000, 104, 2, 2, 0 }, /* actual: 998.4 MHz */ + { 0, 0, 0, 0, 0, 0 }, +}; + +static struct tegra_clk_pll_params pll_x_params =3D { + .input_min =3D 13500000, + .input_max =3D 800000000, + .cf_min =3D 13500000, + .cf_max =3D 38400000, + .vco_min =3D 1300000000, + .vco_max =3D 3000000000UL, + .base_reg =3D PLLX_BASE, + .misc_reg =3D PLLX_MISC0, + .lock_mask =3D PLL_BASE_LOCK, + .lock_enable_bit_idx =3D PLL_MISC_LOCK_ENABLE, + .lock_delay =3D 300, + .ext_misc_reg[0] =3D PLLX_MISC0, + .ext_misc_reg[1] =3D PLLX_MISC1, + .ext_misc_reg[2] =3D PLLX_MISC2, + .ext_misc_reg[3] =3D PLLX_MISC3, + .ext_misc_reg[4] =3D PLLX_MISC4, + .ext_misc_reg[5] =3D PLLX_MISC5, + .iddq_reg =3D PLLX_MISC3, + .iddq_bit_idx =3D PLLXP_IDDQ_BIT, + .max_p =3D PLL_QLIN_PDIV_MAX, + .mdiv_default =3D 2, + .dyn_ramp_reg =3D PLLX_MISC2, + .stepa_shift =3D 16, + .stepb_shift =3D 24, + .round_p_to_pdiv =3D pll_qlin_p_to_pdiv, + .pdiv_tohw =3D pll_qlin_pdiv_to_hw, + .div_nmp =3D &pllx_nmp, + .freq_table =3D pll_x_freq_table, + .flags =3D TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE, + .dyn_ramp =3D tegra210_pllx_dyn_ramp, + .set_defaults =3D tegra210_pllx_set_defaults, + .calc_rate =3D tegra210_pll_fixed_mdiv_cfg, +}; + +static struct div_nmp pllc_nmp =3D { + .divm_shift =3D 0, + .divm_width =3D 8, + .divn_shift =3D 10, + .divn_width =3D 8, + .divp_shift =3D 20, + .divp_width =3D 5, +}; + +static struct tegra_clk_pll_freq_table pll_cx_freq_table[] =3D { + { 38400000, 510000000, 53, 2, 2, 0 }, /* actual: 508.8 MHz */ + { 0, 0, 0, 0, 0, 0 }, +}; + +static struct tegra_clk_pll_params pll_c_params =3D { + .input_min =3D 19200000, + .input_max =3D 700000000, + .cf_min =3D 19200000, + .cf_max =3D 38400000, + .vco_min =3D 600000000, + .vco_max =3D 1200000000, + .base_reg =3D PLLC_BASE, + .misc_reg =3D PLLC_MISC0, + .lock_mask =3D PLL_BASE_LOCK, + .lock_delay =3D 300, + .iddq_reg =3D PLLC_MISC1, + .iddq_bit_idx =3D PLLCX_IDDQ_BIT, + .reset_reg =3D PLLC_MISC0, + .reset_bit_idx =3D PLLCX_RESET_BIT, + .max_p =3D PLL_QLIN_PDIV_MAX, + .ext_misc_reg[0] =3D PLLC_MISC0, + .ext_misc_reg[1] =3D PLLC_MISC1, + .ext_misc_reg[2] =3D PLLC_MISC2, + .ext_misc_reg[3] =3D PLLC_MISC3, + .round_p_to_pdiv =3D pll_qlin_p_to_pdiv, + .pdiv_tohw =3D pll_qlin_pdiv_to_hw, + .mdiv_default =3D 2, + .div_nmp =3D &pllc_nmp, + .freq_table =3D pll_cx_freq_table, + .flags =3D TEGRA_PLL_USE_LOCK, + .set_defaults =3D _pllc_set_defaults, + .calc_rate =3D tegra210_pll_fixed_mdiv_cfg, +}; + +static struct div_nmp pllcx_nmp =3D { + .divm_shift =3D 0, + .divm_width =3D 8, + .divn_shift =3D 10, + .divn_width =3D 8, + .divp_shift =3D 20, + .divp_width =3D 5, +}; + +static struct tegra_clk_pll_params pll_c2_params =3D { + .input_min =3D 19200000, + .input_max =3D 700000000, + .cf_min =3D 19200000, + .cf_max =3D 38400000, + .vco_min =3D 600000000, + .vco_max =3D 1200000000, + .base_reg =3D PLLC2_BASE, + .misc_reg =3D PLLC2_MISC0, + .iddq_reg =3D PLLC2_MISC1, + .iddq_bit_idx =3D PLLCX_IDDQ_BIT, + .reset_reg =3D PLLC2_MISC0, + .reset_bit_idx =3D PLLCX_RESET_BIT, + .lock_mask =3D PLLCX_BASE_LOCK, + .lock_delay =3D 300, + .round_p_to_pdiv =3D pll_qlin_p_to_pdiv, + .pdiv_tohw =3D pll_qlin_pdiv_to_hw, + .mdiv_default =3D 2, + .div_nmp =3D &pllcx_nmp, + .max_p =3D PLL_QLIN_PDIV_MAX, + .ext_misc_reg[0] =3D PLLC2_MISC0, + .ext_misc_reg[1] =3D PLLC2_MISC1, + .ext_misc_reg[2] =3D PLLC2_MISC2, + .ext_misc_reg[3] =3D PLLC2_MISC3, + .freq_table =3D pll_cx_freq_table, + .flags =3D TEGRA_PLL_USE_LOCK, + .set_defaults =3D _pllc2_set_defaults, + .calc_rate =3D tegra210_pll_fixed_mdiv_cfg, +}; + +static struct tegra_clk_pll_params pll_c3_params =3D { + .input_min =3D 19200000, + .input_max =3D 700000000, + .cf_min =3D 19200000, + .cf_max =3D 38400000, + .vco_min =3D 600000000, + .vco_max =3D 1200000000, + .base_reg =3D PLLC3_BASE, + .misc_reg =3D PLLC3_MISC0, + .lock_mask =3D PLLCX_BASE_LOCK, + .lock_delay =3D 300, + .iddq_reg =3D PLLC3_MISC1, + .iddq_bit_idx =3D PLLCX_IDDQ_BIT, + .reset_reg =3D PLLC3_MISC0, + .reset_bit_idx =3D PLLCX_RESET_BIT, + .round_p_to_pdiv =3D pll_qlin_p_to_pdiv, + .pdiv_tohw =3D pll_qlin_pdiv_to_hw, + .mdiv_default =3D 2, + .div_nmp =3D &pllcx_nmp, + .max_p =3D PLL_QLIN_PDIV_MAX, + .ext_misc_reg[0] =3D PLLC3_MISC0, + .ext_misc_reg[1] =3D PLLC3_MISC1, + .ext_misc_reg[2] =3D PLLC3_MISC2, + .ext_misc_reg[3] =3D PLLC3_MISC3, + .freq_table =3D pll_cx_freq_table, + .flags =3D TEGRA_PLL_USE_LOCK, + .set_defaults =3D _pllc3_set_defaults, + .calc_rate =3D tegra210_pll_fixed_mdiv_cfg, +}; + +static struct div_nmp pllss_nmp =3D { + .divm_shift =3D 0, + .divm_width =3D 8, + .divn_shift =3D 8, + .divn_width =3D 8, + .divp_shift =3D 19, + .divp_width =3D 5, +}; + +static struct tegra_clk_pll_freq_table pll_c4_vco_freq_table[] =3D { + { 38400000, 998400000, 52, 2, 1, 0 }, + { 38400000, 787200000, 41, 2, 1, 0 }, + { 0, 0, 0, 0, 0, 0 }, +}; + +static const struct clk_div_table pll_vco_post_div_table[] =3D { + { .val =3D 0, .div =3D 1 }, + { .val =3D 1, .div =3D 2 }, + { .val =3D 2, .div =3D 3 }, + { .val =3D 3, .div =3D 4 }, + { .val =3D 4, .div =3D 5 }, + { .val =3D 5, .div =3D 6 }, + { .val =3D 6, .div =3D 8 }, + { .val =3D 7, .div =3D 9 }, + { .val =3D 8, .div =3D 10 }, + { .val =3D 9, .div =3D 12 }, + { .val =3D 10, .div =3D 15 }, + { .val =3D 11, .div =3D 16 }, + { .val =3D 12, .div =3D 18 }, + { .val =3D 13, .div =3D 20 }, + { .val =3D 14, .div =3D 24 }, + { .val =3D 15, .div =3D 30 }, + { .val =3D 16, .div =3D 31 }, + { .val =3D 0, .div =3D 0 }, +}; + +static struct tegra_clk_pll_params pll_c4_vco_params =3D { + .input_min =3D 12000000, + .input_max =3D 800000000, + .cf_min =3D 12000000, + .cf_max =3D 38400000, + .vco_min =3D 500000000, + .vco_max =3D 1000000000, + .base_reg =3D PLLC4_BASE, + .misc_reg =3D PLLC4_MISC0, + .lock_mask =3D PLL_BASE_LOCK, + .lock_delay =3D 300, + .max_p =3D PLL_QLIN_PDIV_MAX, + .ext_misc_reg[0] =3D PLLC4_MISC0, + .iddq_reg =3D PLLC4_BASE, + .iddq_bit_idx =3D PLLSS_IDDQ_BIT, + .round_p_to_pdiv =3D pll_qlin_p_to_pdiv, + .pdiv_tohw =3D pll_qlin_pdiv_to_hw, + .mdiv_default =3D 2, + .div_nmp =3D &pllss_nmp, + .freq_table =3D pll_c4_vco_freq_table, + .set_defaults =3D tegra210_pllc4_set_defaults, + .flags =3D TEGRA_PLL_USE_LOCK | TEGRA_PLL_VCO_OUT, + .calc_rate =3D tegra210_pll_fixed_mdiv_cfg, +}; + +static struct tegra_clk_pll_freq_table pll_e_freq_table[] =3D { + /* PLLE special case: use cpcon field to store cml divider value */ + { 38400000, 100000000, 125, 2, 1, 14 }, + { 0, 0, 0, 0, 0, 0 }, +}; + +static struct div_nmp plle_nmp =3D { + .divm_shift =3D 0, + .divm_width =3D 8, + .divn_shift =3D 8, + .divn_width =3D 8, + .divp_shift =3D 24, + .divp_width =3D 5, +}; + +static struct tegra_clk_pll_params pll_e_params =3D { + .input_min =3D 19200000, + .input_max =3D 800000000, + .cf_min =3D 19200000, + .cf_max =3D 38400000, + .vco_min =3D 1250000000, + .vco_max =3D 2500000000U, + .base_reg =3D PLLE_BASE, + .misc_reg =3D PLLE_MISC0, + .aux_reg =3D PLLE_AUX, + .lock_mask =3D PLLE_MISC_LOCK, + .lock_enable_bit_idx =3D PLLE_MISC_LOCK_ENABLE, + .lock_delay =3D 300, + .div_nmp =3D &plle_nmp, + .ssc_ctrl_en_mask =3D PLLE_SS_COEFFICIENTS_VAL, +#if PLLE_SS_ENABLE + .ssc_ctrl_reg =3D PLLE_SS_CTRL, +#endif + .freq_table =3D pll_e_freq_table, + .flags =3D TEGRA_PLL_FIXED | TEGRA_PLL_LOCK_MISC | TEGRA_PLL_USE_LOCK | + TEGRA_PLL_HAS_LOCK_ENABLE, + .fixed_rate =3D 100000000, + .calc_rate =3D tegra210_pll_fixed_mdiv_cfg, +}; + +static struct tegra_clk_pll_freq_table pll_re_vco_freq_table[] =3D { + { 38400000, 672000000, 70, 4, 1, 0 }, + { 38400000, 624000000, 65, 4, 1, 0 }, + { 60000000, 625000000, 125, 12, 1, 0 }, + { 0, 0, 0, 0, 0, 0 }, +}; + +static struct div_nmp pllre_nmp =3D { + .divm_shift =3D 0, + .divm_width =3D 8, + .divn_shift =3D 8, + .divn_width =3D 8, + .divp_shift =3D 16, + .divp_width =3D 5, +}; + +static struct tegra_clk_pll_params pll_re_vco_params =3D { + .input_min =3D 9600000, + .input_max =3D 800000000, + .cf_min =3D 9600000, + .cf_max =3D 19200000, + .vco_min =3D 350000000, + .vco_max =3D 700000000, + .base_reg =3D PLLRE_BASE, + .misc_reg =3D PLLRE_MISC0, + .lock_mask =3D PLLRE_MISC_LOCK, + .lock_delay =3D 300, + .max_p =3D PLL_QLIN_PDIV_MAX, + .ext_misc_reg[0] =3D PLLRE_MISC0, + .iddq_reg =3D PLLRE_MISC0, + .iddq_bit_idx =3D PLLRE_IDDQ_BIT, + .round_p_to_pdiv =3D pll_qlin_p_to_pdiv, + .pdiv_tohw =3D pll_qlin_pdiv_to_hw, + .div_nmp =3D &pllre_nmp, + .mdiv_default =3D 4, + .freq_table =3D pll_re_vco_freq_table, + .flags =3D TEGRA_PLL_USE_LOCK | TEGRA_PLL_LOCK_MISC | TEGRA_PLL_VCO_OUT, + .set_defaults =3D tegra210_pllre_set_defaults, + .calc_rate =3D tegra210_pll_fixed_mdiv_cfg, +}; + +static struct div_nmp pllp_nmp =3D { + .divm_shift =3D 0, + .divm_width =3D 8, + .divn_shift =3D 10, + .divn_width =3D 8, + .divp_shift =3D 20, + .divp_width =3D 5, +}; + +static struct tegra_clk_pll_freq_table pll_p_freq_table[] =3D { + /* cf =3D 4.8MHz, allowed exception */ + { 38400000, 408000000, 85, 8, 1, 0 }, + { 0, 0, 0, 0, 0, 0 }, +}; + +static struct tegra_clk_pll_params pll_p_params =3D { + .input_min =3D 9600000, + .input_max =3D 800000000, + .cf_min =3D 9600000, + .cf_max =3D 19200000, + .vco_min =3D 350000000, + .vco_max =3D 700000000, + .base_reg =3D PLLP_BASE, + .misc_reg =3D PLLP_MISC0, + .lock_mask =3D PLL_BASE_LOCK, + .lock_delay =3D 300, + .iddq_reg =3D PLLP_MISC0, + .iddq_bit_idx =3D PLLXP_IDDQ_BIT, + .ext_misc_reg[0] =3D PLLP_MISC0, + .ext_misc_reg[1] =3D PLLP_MISC1, + .div_nmp =3D &pllp_nmp, + .freq_table =3D pll_p_freq_table, + .fixed_rate =3D 408000000, + .flags =3D TEGRA_PLL_FIXED | TEGRA_PLL_USE_LOCK | TEGRA_PLL_VCO_OUT, + .mdiv_default =3D 4, + .set_defaults =3D tegra210_pllp_set_defaults, + .calc_rate =3D tegra210_pll_fixed_mdiv_cfg, +}; + +static struct tegra_clk_pll_params pll_a1_params =3D { + .input_min =3D 19200000, + .input_max =3D 700000000, + .cf_min =3D 19200000, + .cf_max =3D 38400000, + .vco_min =3D 600000000, + .vco_max =3D 1200000000, + .base_reg =3D PLLA1_BASE, + .misc_reg =3D PLLA1_MISC0, + .lock_mask =3D PLLCX_BASE_LOCK, + .lock_delay =3D 300, + .iddq_reg =3D PLLA1_MISC1, + .iddq_bit_idx =3D PLLCX_IDDQ_BIT, + .reset_reg =3D PLLA1_MISC0, + .reset_bit_idx =3D PLLCX_RESET_BIT, + .round_p_to_pdiv =3D pll_qlin_p_to_pdiv, + .pdiv_tohw =3D pll_qlin_pdiv_to_hw, + .div_nmp =3D &pllcx_nmp, + .ext_misc_reg[0] =3D PLLA1_MISC0, + .ext_misc_reg[1] =3D PLLA1_MISC1, + .ext_misc_reg[2] =3D PLLA1_MISC2, + .ext_misc_reg[3] =3D PLLA1_MISC3, + .freq_table =3D pll_cx_freq_table, + .flags =3D TEGRA_PLL_USE_LOCK, + .mdiv_default =3D 2, + .set_defaults =3D _plla1_set_defaults, + .calc_rate =3D tegra210_pll_fixed_mdiv_cfg, +}; + +static struct div_nmp plla_nmp =3D { + .divm_shift =3D 0, + .divm_width =3D 8, + .divn_shift =3D 8, + .divn_width =3D 8, + .divp_shift =3D 20, + .divp_width =3D 5, +}; + +static struct tegra_clk_pll_freq_table pll_a_freq_table[] =3D { + { 38400000, 282240000, 29, 2, 2, 1, 0xfccc }, /* actual: 282239063 */ + { 38400000, 368640000, 38, 2, 2, 1, 0xfccc }, /* actual: 368639063 */ + { 0, 0, 0, 0, 0, 0, 0 }, +}; + +static struct tegra_clk_pll_params pll_a_params =3D { + .input_min =3D 12000000, + .input_max =3D 800000000, + .cf_min =3D 12000000, + .cf_max =3D 38400000, + .vco_min =3D 500000000, + .vco_max =3D 1000000000, + .base_reg =3D PLLA_BASE, + .misc_reg =3D PLLA_MISC0, + .lock_mask =3D PLL_BASE_LOCK, + .lock_delay =3D 300, + .round_p_to_pdiv =3D pll_qlin_p_to_pdiv, + .pdiv_tohw =3D pll_qlin_pdiv_to_hw, + .iddq_reg =3D PLLA_BASE, + .iddq_bit_idx =3D PLLA_IDDQ_BIT, + .div_nmp =3D &plla_nmp, + .sdm_din_reg =3D PLLA_MISC1, + .sdm_din_mask =3D PLLA_SDM_DIN_MASK, + .sdm_ctrl_reg =3D PLLA_MISC2, + .sdm_ctrl_en_mask =3D PLLA_SDM_EN_MASK, + .ext_misc_reg[0] =3D PLLA_MISC0, + .ext_misc_reg[1] =3D PLLA_MISC1, + .ext_misc_reg[2] =3D PLLA_MISC2, + .freq_table =3D pll_a_freq_table, + .flags =3D TEGRA_PLL_USE_LOCK | TEGRA_MDIV_NEW, + .mdiv_default =3D 2, + .set_defaults =3D tegra210_plla_set_defaults, + .calc_rate =3D tegra210_pll_fixed_mdiv_cfg, + .set_gain =3D tegra210_clk_pll_set_gain, + .adjust_vco =3D tegra210_clk_adjust_vco_min, +}; + +static struct div_nmp plld_nmp =3D { + .divm_shift =3D 0, + .divm_width =3D 8, + .divn_shift =3D 11, + .divn_width =3D 8, + .divp_shift =3D 20, + .divp_width =3D 3, +}; + +static struct tegra_clk_pll_freq_table pll_d_freq_table[] =3D { + { 38400000, 594000000, 30, 1, 2, 0, 0x0e00 }, + { 0, 0, 0, 0, 0, 0, 0 }, +}; + +static struct tegra_clk_pll_params pll_d_params =3D { + .input_min =3D 13500000, + .input_max =3D 800000000, + .cf_min =3D 13500000, + .cf_max =3D 38400000, + .vco_min =3D 800000000, + .vco_max =3D 1620000000, + .base_reg =3D PLLD_BASE, + .misc_reg =3D PLLD_MISC0, + .lock_mask =3D PLL_BASE_LOCK, + .lock_delay =3D 1000, + .iddq_reg =3D PLLD_MISC0, + .iddq_bit_idx =3D PLLD_IDDQ_BIT, + .round_p_to_pdiv =3D pll_expo_p_to_pdiv, + .pdiv_tohw =3D pll_expo_pdiv_to_hw, + .div_nmp =3D &plld_nmp, + .sdm_din_reg =3D PLLD_MISC0, + .sdm_din_mask =3D PLLA_SDM_DIN_MASK, + .sdm_ctrl_reg =3D PLLD_MISC0, + .sdm_ctrl_en_mask =3D PLLD_SDM_EN_MASK, + .ext_misc_reg[0] =3D PLLD_MISC0, + .ext_misc_reg[1] =3D PLLD_MISC1, + .freq_table =3D pll_d_freq_table, + .flags =3D TEGRA_PLL_USE_LOCK, + .mdiv_default =3D 1, + .set_defaults =3D tegra210_plld_set_defaults, + .calc_rate =3D tegra210_pll_fixed_mdiv_cfg, + .set_gain =3D tegra210_clk_pll_set_gain, + .adjust_vco =3D tegra210_clk_adjust_vco_min, +}; + +static struct tegra_clk_pll_freq_table tegra210_pll_d2_freq_table[] =3D { + { 38400000, 594000000, 30, 1, 2, 0, 0x0e00 }, + { 0, 0, 0, 0, 0, 0, 0 }, +}; + +/* s/w policy, always tegra_pll_ref */ +static struct tegra_clk_pll_params pll_d2_params =3D { + .input_min =3D 13500000, + .input_max =3D 800000000, + .cf_min =3D 13500000, + .cf_max =3D 38400000, + .vco_min =3D 780000000, + .vco_max =3D 1620000000, + .base_reg =3D PLLD2_BASE, + .misc_reg =3D PLLD2_MISC0, + .lock_mask =3D PLL_BASE_LOCK, + .lock_delay =3D 300, + .iddq_reg =3D PLLD2_BASE, + .iddq_bit_idx =3D PLLSS_IDDQ_BIT, + .sdm_din_reg =3D PLLD2_MISC3, + .sdm_din_mask =3D PLLA_SDM_DIN_MASK, + .sdm_ctrl_reg =3D PLLD2_MISC1, + .sdm_ctrl_en_mask =3D PLLD2_SDM_EN_MASK, + .ssc_ctrl_reg =3D PLLD2_MISC1, + .ssc_ctrl_en_mask =3D PLLD2_SSC_EN_MASK, + .round_p_to_pdiv =3D pll_qlin_p_to_pdiv, + .pdiv_tohw =3D pll_qlin_pdiv_to_hw, + .div_nmp =3D &pllss_nmp, + .ext_misc_reg[0] =3D PLLD2_MISC0, + .ext_misc_reg[1] =3D PLLD2_MISC1, + .ext_misc_reg[2] =3D PLLD2_MISC2, + .ext_misc_reg[3] =3D PLLD2_MISC3, + .ext_misc_reg[4] =3D PLLD2_MISC4, + .max_p =3D PLL_QLIN_PDIV_MAX, + .mdiv_default =3D 1, + .freq_table =3D tegra210_pll_d2_freq_table, + .set_defaults =3D tegra210_plld2_set_defaults, + .flags =3D TEGRA_PLL_USE_LOCK, + .calc_rate =3D tegra210_pll_fixed_mdiv_cfg, + .set_gain =3D tegra210_clk_pll_set_gain, + .adjust_vco =3D tegra210_clk_adjust_vco_min, +}; + +static struct tegra_clk_pll_freq_table pll_dp_freq_table[] =3D { + { 38400000, 270000000, 42, 1, 6, 0, 0xf600 }, + { 0, 0, 0, 0, 0, 0, 0 }, +}; + +static struct tegra_clk_pll_params pll_dp_params =3D { + .input_min =3D 13500000, + .input_max =3D 800000000, + .cf_min =3D 13500000, + .cf_max =3D 38400000, + .vco_min =3D 780000000, + .vco_max =3D 1620000000, + .base_reg =3D PLLDP_BASE, + .misc_reg =3D PLLDP_MISC, + .lock_mask =3D PLL_BASE_LOCK, + .lock_delay =3D 300, + .iddq_reg =3D PLLDP_BASE, + .iddq_bit_idx =3D PLLSS_IDDQ_BIT, + .sdm_din_reg =3D PLLDP_SS_CTRL2, + .sdm_din_mask =3D PLLA_SDM_DIN_MASK, + .sdm_ctrl_reg =3D PLLDP_SS_CFG, + .sdm_ctrl_en_mask =3D PLLDP_SDM_EN_MASK, + .ssc_ctrl_reg =3D PLLDP_SS_CFG, + .ssc_ctrl_en_mask =3D PLLDP_SSC_EN_MASK, + .round_p_to_pdiv =3D pll_qlin_p_to_pdiv, + .pdiv_tohw =3D pll_qlin_pdiv_to_hw, + .div_nmp =3D &pllss_nmp, + .ext_misc_reg[0] =3D PLLDP_MISC, + .ext_misc_reg[1] =3D PLLDP_SS_CFG, + .ext_misc_reg[2] =3D PLLDP_SS_CTRL1, + .ext_misc_reg[3] =3D PLLDP_SS_CTRL2, + .ext_misc_reg[4] =3D PLLDP_MISC4, + .max_p =3D PLL_QLIN_PDIV_MAX, + .mdiv_default =3D 1, + .freq_table =3D pll_dp_freq_table, + .set_defaults =3D tegra210_plldp_set_defaults, + .flags =3D TEGRA_PLL_USE_LOCK, + .calc_rate =3D tegra210_pll_fixed_mdiv_cfg, + .set_gain =3D tegra210_clk_pll_set_gain, + .adjust_vco =3D tegra210_clk_adjust_vco_min, +}; + +static struct div_nmp pllu_nmp =3D { + .divm_shift =3D 0, + .divm_width =3D 8, + .divn_shift =3D 8, + .divn_width =3D 8, + .divp_shift =3D 16, + .divp_width =3D 5, +}; + +static struct tegra_clk_pll_freq_table pll_u_freq_table[] =3D { + { 38400000, 240000000, 25, 2, 1, 0 }, + { 0, 0, 0, 0, 0, 0 }, +}; + +static struct tegra_clk_pll_params pll_u_vco_params =3D { + .input_min =3D 9600000, + .input_max =3D 800000000, + .cf_min =3D 9600000, + .cf_max =3D 19200000, + .vco_min =3D 350000000, + .vco_max =3D 700000000, + .base_reg =3D PLLU_BASE, + .misc_reg =3D PLLU_MISC0, + .lock_mask =3D PLL_BASE_LOCK, + .lock_delay =3D 1000, + .iddq_reg =3D PLLU_MISC0, + .iddq_bit_idx =3D PLLU_IDDQ_BIT, + .ext_misc_reg[0] =3D PLLU_MISC0, + .ext_misc_reg[1] =3D PLLU_MISC1, + .round_p_to_pdiv =3D pll_qlin_p_to_pdiv, + .pdiv_tohw =3D pll_qlin_pdiv_to_hw, + .div_nmp =3D &pllu_nmp, + .mdiv_default =3D 2, + .freq_table =3D pll_u_freq_table, + .flags =3D TEGRA_PLLU | TEGRA_PLL_USE_LOCK | TEGRA_PLL_VCO_OUT, +}; + +struct utmi_clk_param { + /* Oscillator Frequency in KHz */ + u32 osc_frequency; + /* UTMIP PLL Enable Delay Count */ + u8 enable_delay_count; + /* UTMIP PLL Stable count */ + u16 stable_count; + /* UTMIP PLL Active delay count */ + u8 active_delay_count; + /* UTMIP PLL Xtal frequency count */ + u16 xtal_freq_count; +}; + +static const struct utmi_clk_param utmi_parameters[] =3D { + { + .osc_frequency =3D 38400000, .enable_delay_count =3D 0x0, + .stable_count =3D 0x0, .active_delay_count =3D 0x6, + .xtal_freq_count =3D 0x80 + }, { + .osc_frequency =3D 13000000, .enable_delay_count =3D 0x02, + .stable_count =3D 0x33, .active_delay_count =3D 0x05, + .xtal_freq_count =3D 0x7f + }, { + .osc_frequency =3D 19200000, .enable_delay_count =3D 0x03, + .stable_count =3D 0x4b, .active_delay_count =3D 0x06, + .xtal_freq_count =3D 0xbb + }, { + .osc_frequency =3D 12000000, .enable_delay_count =3D 0x02, + .stable_count =3D 0x2f, .active_delay_count =3D 0x08, + .xtal_freq_count =3D 0x76 + }, { + .osc_frequency =3D 26000000, .enable_delay_count =3D 0x04, + .stable_count =3D 0x66, .active_delay_count =3D 0x09, + .xtal_freq_count =3D 0xfe + }, { + .osc_frequency =3D 16800000, .enable_delay_count =3D 0x03, + .stable_count =3D 0x41, .active_delay_count =3D 0x0a, + .xtal_freq_count =3D 0xa4 + }, +}; + +static struct tegra_clk tegra210_clks[tegra_clk_max] __initdata =3D { + [tegra_clk_ispb] =3D { .dt_id =3D TEGRA210_CLK_ISPB, .present =3D true }, + [tegra_clk_rtc] =3D { .dt_id =3D TEGRA210_CLK_RTC, .present =3D true }, + [tegra_clk_timer] =3D { .dt_id =3D TEGRA210_CLK_TIMER, .present =3D true = }, + [tegra_clk_uarta_8] =3D { .dt_id =3D TEGRA210_CLK_UARTA, .present =3D tru= e }, + [tegra_clk_i2s1] =3D { .dt_id =3D TEGRA210_CLK_I2S1, .present =3D true }, + [tegra_clk_i2c1] =3D { .dt_id =3D TEGRA210_CLK_I2C1, .present =3D true }, + [tegra_clk_sdmmc1_9] =3D { .dt_id =3D TEGRA210_CLK_SDMMC1, .present =3D t= rue }, + [tegra_clk_pwm] =3D { .dt_id =3D TEGRA210_CLK_PWM, .present =3D true }, + [tegra_clk_i2s2] =3D { .dt_id =3D TEGRA210_CLK_I2S2, .present =3D true }, + [tegra_clk_usbd] =3D { .dt_id =3D TEGRA210_CLK_USBD, .present =3D true }, + [tegra_clk_isp_9] =3D { .dt_id =3D TEGRA210_CLK_ISP, .present =3D true }, + [tegra_clk_disp2_8] =3D { .dt_id =3D TEGRA210_CLK_DISP2, .present =3D tru= e }, + [tegra_clk_disp1_8] =3D { .dt_id =3D TEGRA210_CLK_DISP1, .present =3D tru= e }, + [tegra_clk_host1x_9] =3D { .dt_id =3D TEGRA210_CLK_HOST1X, .present =3D t= rue }, + [tegra_clk_i2s0] =3D { .dt_id =3D TEGRA210_CLK_I2S0, .present =3D true }, + [tegra_clk_apbdma] =3D { .dt_id =3D TEGRA210_CLK_APBDMA, .present =3D tru= e }, + [tegra_clk_kfuse] =3D { .dt_id =3D TEGRA210_CLK_KFUSE, .present =3D true = }, + [tegra_clk_sbc1_9] =3D { .dt_id =3D TEGRA210_CLK_SBC1, .present =3D true = }, + [tegra_clk_sbc2_9] =3D { .dt_id =3D TEGRA210_CLK_SBC2, .present =3D true = }, + [tegra_clk_sbc3_9] =3D { .dt_id =3D TEGRA210_CLK_SBC3, .present =3D true = }, + [tegra_clk_i2c5] =3D { .dt_id =3D TEGRA210_CLK_I2C5, .present =3D true }, + [tegra_clk_csi] =3D { .dt_id =3D TEGRA210_CLK_CSI, .present =3D true }, + [tegra_clk_i2c2] =3D { .dt_id =3D TEGRA210_CLK_I2C2, .present =3D true }, + [tegra_clk_uartc_8] =3D { .dt_id =3D TEGRA210_CLK_UARTC, .present =3D tru= e }, + [tegra_clk_mipi_cal] =3D { .dt_id =3D TEGRA210_CLK_MIPI_CAL, .present =3D= true }, + [tegra_clk_usb2] =3D { .dt_id =3D TEGRA210_CLK_USB2, .present =3D true }, + [tegra_clk_bsev] =3D { .dt_id =3D TEGRA210_CLK_BSEV, .present =3D true }, + [tegra_clk_uartd_8] =3D { .dt_id =3D TEGRA210_CLK_UARTD, .present =3D tru= e }, + [tegra_clk_i2c3] =3D { .dt_id =3D TEGRA210_CLK_I2C3, .present =3D true }, + [tegra_clk_sbc4_9] =3D { .dt_id =3D TEGRA210_CLK_SBC4, .present =3D true = }, + [tegra_clk_sdmmc3_9] =3D { .dt_id =3D TEGRA210_CLK_SDMMC3, .present =3D t= rue }, + [tegra_clk_pcie] =3D { .dt_id =3D TEGRA210_CLK_PCIE, .present =3D true }, + [tegra_clk_owr_8] =3D { .dt_id =3D TEGRA210_CLK_OWR, .present =3D true }, + [tegra_clk_afi] =3D { .dt_id =3D TEGRA210_CLK_AFI, .present =3D true }, + [tegra_clk_csite_8] =3D { .dt_id =3D TEGRA210_CLK_CSITE, .present =3D tru= e }, + [tegra_clk_soc_therm_8] =3D { .dt_id =3D TEGRA210_CLK_SOC_THERM, .present= =3D true }, + [tegra_clk_dtv] =3D { .dt_id =3D TEGRA210_CLK_DTV, .present =3D true }, + [tegra_clk_i2cslow] =3D { .dt_id =3D TEGRA210_CLK_I2CSLOW, .present =3D t= rue }, + [tegra_clk_tsec_8] =3D { .dt_id =3D TEGRA210_CLK_TSEC, .present =3D true = }, + [tegra_clk_xusb_host] =3D { .dt_id =3D TEGRA210_CLK_XUSB_HOST, .present = =3D true }, + [tegra_clk_csus] =3D { .dt_id =3D TEGRA210_CLK_CSUS, .present =3D true }, + [tegra_clk_mselect] =3D { .dt_id =3D TEGRA210_CLK_MSELECT, .present =3D t= rue }, + [tegra_clk_tsensor] =3D { .dt_id =3D TEGRA210_CLK_TSENSOR, .present =3D t= rue }, + [tegra_clk_i2s3] =3D { .dt_id =3D TEGRA210_CLK_I2S3, .present =3D true }, + [tegra_clk_i2s4] =3D { .dt_id =3D TEGRA210_CLK_I2S4, .present =3D true }, + [tegra_clk_i2c4] =3D { .dt_id =3D TEGRA210_CLK_I2C4, .present =3D true }, + [tegra_clk_d_audio] =3D { .dt_id =3D TEGRA210_CLK_D_AUDIO, .present =3D t= rue }, + [tegra_clk_hda2codec_2x_8] =3D { .dt_id =3D TEGRA210_CLK_HDA2CODEC_2X, .p= resent =3D true }, + [tegra_clk_spdif_2x] =3D { .dt_id =3D TEGRA210_CLK_SPDIF_2X, .present =3D= true }, + [tegra_clk_actmon] =3D { .dt_id =3D TEGRA210_CLK_ACTMON, .present =3D tru= e }, + [tegra_clk_extern1] =3D { .dt_id =3D TEGRA210_CLK_EXTERN1, .present =3D t= rue }, + [tegra_clk_extern2] =3D { .dt_id =3D TEGRA210_CLK_EXTERN2, .present =3D t= rue }, + [tegra_clk_extern3] =3D { .dt_id =3D TEGRA210_CLK_EXTERN3, .present =3D t= rue }, + [tegra_clk_sata_oob_8] =3D { .dt_id =3D TEGRA210_CLK_SATA_OOB, .present = =3D true }, + [tegra_clk_sata_8] =3D { .dt_id =3D TEGRA210_CLK_SATA, .present =3D true = }, + [tegra_clk_hda_8] =3D { .dt_id =3D TEGRA210_CLK_HDA, .present =3D true }, + [tegra_clk_hda2hdmi] =3D { .dt_id =3D TEGRA210_CLK_HDA2HDMI, .present =3D= true }, + [tegra_clk_cilab] =3D { .dt_id =3D TEGRA210_CLK_CILAB, .present =3D true = }, + [tegra_clk_cilcd] =3D { .dt_id =3D TEGRA210_CLK_CILCD, .present =3D true = }, + [tegra_clk_cile] =3D { .dt_id =3D TEGRA210_CLK_CILE, .present =3D true }, + [tegra_clk_dsialp] =3D { .dt_id =3D TEGRA210_CLK_DSIALP, .present =3D tru= e }, + [tegra_clk_dsiblp] =3D { .dt_id =3D TEGRA210_CLK_DSIBLP, .present =3D tru= e }, + [tegra_clk_entropy_8] =3D { .dt_id =3D TEGRA210_CLK_ENTROPY, .present =3D= true }, + [tegra_clk_xusb_ss] =3D { .dt_id =3D TEGRA210_CLK_XUSB_SS, .present =3D t= rue }, + [tegra_clk_i2c6] =3D { .dt_id =3D TEGRA210_CLK_I2C6, .present =3D true }, + [tegra_clk_vim2_clk] =3D { .dt_id =3D TEGRA210_CLK_VIM2_CLK, .present =3D= true }, + [tegra_clk_clk72Mhz_8] =3D { .dt_id =3D TEGRA210_CLK_CLK72MHZ, .present = =3D true }, + [tegra_clk_vic03_8] =3D { .dt_id =3D TEGRA210_CLK_VIC03, .present =3D tru= e }, + [tegra_clk_dpaux] =3D { .dt_id =3D TEGRA210_CLK_DPAUX, .present =3D true = }, + [tegra_clk_dpaux1] =3D { .dt_id =3D TEGRA210_CLK_DPAUX1, .present =3D tru= e }, + [tegra_clk_sor0] =3D { .dt_id =3D TEGRA210_CLK_SOR0, .present =3D true }, + [tegra_clk_sor0_out] =3D { .dt_id =3D TEGRA210_CLK_SOR0_OUT, .present =3D= true }, + [tegra_clk_sor1] =3D { .dt_id =3D TEGRA210_CLK_SOR1, .present =3D true }, + [tegra_clk_sor1_out] =3D { .dt_id =3D TEGRA210_CLK_SOR1_OUT, .present =3D= true }, + [tegra_clk_gpu] =3D { .dt_id =3D TEGRA210_CLK_GPU, .present =3D true }, + [tegra_clk_pll_g_ref] =3D { .dt_id =3D TEGRA210_CLK_PLL_G_REF, .present = =3D true, }, + [tegra_clk_uartb_8] =3D { .dt_id =3D TEGRA210_CLK_UARTB, .present =3D tru= e }, + [tegra_clk_spdif_in_8] =3D { .dt_id =3D TEGRA210_CLK_SPDIF_IN, .present = =3D true }, + [tegra_clk_spdif_out] =3D { .dt_id =3D TEGRA210_CLK_SPDIF_OUT, .present = =3D true }, + [tegra_clk_vi_10] =3D { .dt_id =3D TEGRA210_CLK_VI, .present =3D true }, + [tegra_clk_vi_sensor_8] =3D { .dt_id =3D TEGRA210_CLK_VI_SENSOR, .present= =3D true }, + [tegra_clk_fuse] =3D { .dt_id =3D TEGRA210_CLK_FUSE, .present =3D true }, + [tegra_clk_fuse_burn] =3D { .dt_id =3D TEGRA210_CLK_FUSE_BURN, .present = =3D true }, + [tegra_clk_clk_32k] =3D { .dt_id =3D TEGRA210_CLK_CLK_32K, .present =3D t= rue }, + [tegra_clk_clk_m] =3D { .dt_id =3D TEGRA210_CLK_CLK_M, .present =3D true = }, + [tegra_clk_osc] =3D { .dt_id =3D TEGRA210_CLK_OSC, .present =3D true }, + [tegra_clk_osc_div2] =3D { .dt_id =3D TEGRA210_CLK_OSC_DIV2, .present =3D= true }, + [tegra_clk_osc_div4] =3D { .dt_id =3D TEGRA210_CLK_OSC_DIV4, .present =3D= true }, + [tegra_clk_pll_ref] =3D { .dt_id =3D TEGRA210_CLK_PLL_REF, .present =3D t= rue }, + [tegra_clk_pll_c] =3D { .dt_id =3D TEGRA210_CLK_PLL_C, .present =3D true = }, + [tegra_clk_pll_c_out1] =3D { .dt_id =3D TEGRA210_CLK_PLL_C_OUT1, .present= =3D true }, + [tegra_clk_pll_c2] =3D { .dt_id =3D TEGRA210_CLK_PLL_C2, .present =3D tru= e }, + [tegra_clk_pll_c3] =3D { .dt_id =3D TEGRA210_CLK_PLL_C3, .present =3D tru= e }, + [tegra_clk_pll_m] =3D { .dt_id =3D TEGRA210_CLK_PLL_M, .present =3D true = }, + [tegra_clk_pll_p] =3D { .dt_id =3D TEGRA210_CLK_PLL_P, .present =3D true = }, + [tegra_clk_pll_p_out1] =3D { .dt_id =3D TEGRA210_CLK_PLL_P_OUT1, .present= =3D true }, + [tegra_clk_pll_p_out3] =3D { .dt_id =3D TEGRA210_CLK_PLL_P_OUT3, .present= =3D true }, + [tegra_clk_pll_p_out4_cpu] =3D { .dt_id =3D TEGRA210_CLK_PLL_P_OUT4, .pre= sent =3D true }, + [tegra_clk_pll_p_out_hsio] =3D { .dt_id =3D TEGRA210_CLK_PLL_P_OUT_HSIO, = .present =3D true }, + [tegra_clk_pll_p_out_xusb] =3D { .dt_id =3D TEGRA210_CLK_PLL_P_OUT_XUSB, = .present =3D true }, + [tegra_clk_pll_p_out_cpu] =3D { .dt_id =3D TEGRA210_CLK_PLL_P_OUT_CPU, .p= resent =3D true }, + [tegra_clk_pll_p_out_adsp] =3D { .dt_id =3D TEGRA210_CLK_PLL_P_OUT_ADSP, = .present =3D true }, + [tegra_clk_pll_a] =3D { .dt_id =3D TEGRA210_CLK_PLL_A, .present =3D true = }, + [tegra_clk_pll_a_out0] =3D { .dt_id =3D TEGRA210_CLK_PLL_A_OUT0, .present= =3D true }, + [tegra_clk_pll_d] =3D { .dt_id =3D TEGRA210_CLK_PLL_D, .present =3D true = }, + [tegra_clk_pll_d_out0] =3D { .dt_id =3D TEGRA210_CLK_PLL_D_OUT0, .present= =3D true }, + [tegra_clk_pll_d2] =3D { .dt_id =3D TEGRA210_CLK_PLL_D2, .present =3D tru= e }, + [tegra_clk_pll_d2_out0] =3D { .dt_id =3D TEGRA210_CLK_PLL_D2_OUT0, .prese= nt =3D true }, + [tegra_clk_pll_u] =3D { .dt_id =3D TEGRA210_CLK_PLL_U, .present =3D true = }, + [tegra_clk_pll_u_out] =3D { .dt_id =3D TEGRA210_CLK_PLL_U_OUT, .present = =3D true }, + [tegra_clk_pll_u_out1] =3D { .dt_id =3D TEGRA210_CLK_PLL_U_OUT1, .present= =3D true }, + [tegra_clk_pll_u_out2] =3D { .dt_id =3D TEGRA210_CLK_PLL_U_OUT2, .present= =3D true }, + [tegra_clk_pll_u_480m] =3D { .dt_id =3D TEGRA210_CLK_PLL_U_480M, .present= =3D true }, + [tegra_clk_pll_u_60m] =3D { .dt_id =3D TEGRA210_CLK_PLL_U_60M, .present = =3D true }, + [tegra_clk_pll_u_48m] =3D { .dt_id =3D TEGRA210_CLK_PLL_U_48M, .present = =3D true }, + [tegra_clk_pll_x] =3D { .dt_id =3D TEGRA210_CLK_PLL_X, .present =3D true = }, + [tegra_clk_pll_x_out0] =3D { .dt_id =3D TEGRA210_CLK_PLL_X_OUT0, .present= =3D true }, + [tegra_clk_pll_re_vco] =3D { .dt_id =3D TEGRA210_CLK_PLL_RE_VCO, .present= =3D true }, + [tegra_clk_pll_re_out] =3D { .dt_id =3D TEGRA210_CLK_PLL_RE_OUT, .present= =3D true }, + [tegra_clk_spdif_in_sync] =3D { .dt_id =3D TEGRA210_CLK_SPDIF_IN_SYNC, .p= resent =3D true }, + [tegra_clk_i2s0_sync] =3D { .dt_id =3D TEGRA210_CLK_I2S0_SYNC, .present = =3D true }, + [tegra_clk_i2s1_sync] =3D { .dt_id =3D TEGRA210_CLK_I2S1_SYNC, .present = =3D true }, + [tegra_clk_i2s2_sync] =3D { .dt_id =3D TEGRA210_CLK_I2S2_SYNC, .present = =3D true }, + [tegra_clk_i2s3_sync] =3D { .dt_id =3D TEGRA210_CLK_I2S3_SYNC, .present = =3D true }, + [tegra_clk_i2s4_sync] =3D { .dt_id =3D TEGRA210_CLK_I2S4_SYNC, .present = =3D true }, + [tegra_clk_vimclk_sync] =3D { .dt_id =3D TEGRA210_CLK_VIMCLK_SYNC, .prese= nt =3D true }, + [tegra_clk_audio0] =3D { .dt_id =3D TEGRA210_CLK_AUDIO0, .present =3D tru= e }, + [tegra_clk_audio1] =3D { .dt_id =3D TEGRA210_CLK_AUDIO1, .present =3D tru= e }, + [tegra_clk_audio2] =3D { .dt_id =3D TEGRA210_CLK_AUDIO2, .present =3D tru= e }, + [tegra_clk_audio3] =3D { .dt_id =3D TEGRA210_CLK_AUDIO3, .present =3D tru= e }, + [tegra_clk_audio4] =3D { .dt_id =3D TEGRA210_CLK_AUDIO4, .present =3D tru= e }, + [tegra_clk_spdif] =3D { .dt_id =3D TEGRA210_CLK_SPDIF, .present =3D true = }, + [tegra_clk_xusb_gate] =3D { .dt_id =3D TEGRA210_CLK_XUSB_GATE, .present = =3D true }, + [tegra_clk_xusb_host_src_8] =3D { .dt_id =3D TEGRA210_CLK_XUSB_HOST_SRC, = .present =3D true }, + [tegra_clk_xusb_falcon_src_8] =3D { .dt_id =3D TEGRA210_CLK_XUSB_FALCON_S= RC, .present =3D true }, + [tegra_clk_xusb_fs_src] =3D { .dt_id =3D TEGRA210_CLK_XUSB_FS_SRC, .prese= nt =3D true }, + [tegra_clk_xusb_ss_src_8] =3D { .dt_id =3D TEGRA210_CLK_XUSB_SS_SRC, .pre= sent =3D true }, + [tegra_clk_xusb_ss_div2] =3D { .dt_id =3D TEGRA210_CLK_XUSB_SS_DIV2, .pre= sent =3D true }, + [tegra_clk_xusb_dev_src_8] =3D { .dt_id =3D TEGRA210_CLK_XUSB_DEV_SRC, .p= resent =3D true }, + [tegra_clk_xusb_dev] =3D { .dt_id =3D TEGRA210_CLK_XUSB_DEV, .present =3D= true }, + [tegra_clk_xusb_hs_src_4] =3D { .dt_id =3D TEGRA210_CLK_XUSB_HS_SRC, .pre= sent =3D true }, + [tegra_clk_xusb_ssp_src] =3D { .dt_id =3D TEGRA210_CLK_XUSB_SSP_SRC, .pre= sent =3D true }, + [tegra_clk_usb2_hsic_trk] =3D { .dt_id =3D TEGRA210_CLK_USB2_HSIC_TRK, .p= resent =3D true }, + [tegra_clk_hsic_trk] =3D { .dt_id =3D TEGRA210_CLK_HSIC_TRK, .present =3D= true }, + [tegra_clk_usb2_trk] =3D { .dt_id =3D TEGRA210_CLK_USB2_TRK, .present =3D= true }, + [tegra_clk_sclk] =3D { .dt_id =3D TEGRA210_CLK_SCLK, .present =3D true }, + [tegra_clk_sclk_mux] =3D { .dt_id =3D TEGRA210_CLK_SCLK_MUX, .present =3D= true }, + [tegra_clk_hclk] =3D { .dt_id =3D TEGRA210_CLK_HCLK, .present =3D true }, + [tegra_clk_pclk] =3D { .dt_id =3D TEGRA210_CLK_PCLK, .present =3D true }, + [tegra_clk_cclk_g] =3D { .dt_id =3D TEGRA210_CLK_CCLK_G, .present =3D tru= e }, + [tegra_clk_cclk_lp] =3D { .dt_id =3D TEGRA210_CLK_CCLK_LP, .present =3D t= rue }, + [tegra_clk_dfll_ref] =3D { .dt_id =3D TEGRA210_CLK_DFLL_REF, .present =3D= true }, + [tegra_clk_dfll_soc] =3D { .dt_id =3D TEGRA210_CLK_DFLL_SOC, .present =3D= true }, + [tegra_clk_vi_sensor2_8] =3D { .dt_id =3D TEGRA210_CLK_VI_SENSOR2, .prese= nt =3D true }, + [tegra_clk_pll_p_out5] =3D { .dt_id =3D TEGRA210_CLK_PLL_P_OUT5, .present= =3D true }, + [tegra_clk_pll_c4] =3D { .dt_id =3D TEGRA210_CLK_PLL_C4, .present =3D tru= e }, + [tegra_clk_pll_dp] =3D { .dt_id =3D TEGRA210_CLK_PLL_DP, .present =3D tru= e }, + [tegra_clk_audio0_mux] =3D { .dt_id =3D TEGRA210_CLK_AUDIO0_MUX, .present= =3D true }, + [tegra_clk_audio1_mux] =3D { .dt_id =3D TEGRA210_CLK_AUDIO1_MUX, .present= =3D true }, + [tegra_clk_audio2_mux] =3D { .dt_id =3D TEGRA210_CLK_AUDIO2_MUX, .present= =3D true }, + [tegra_clk_audio3_mux] =3D { .dt_id =3D TEGRA210_CLK_AUDIO3_MUX, .present= =3D true }, + [tegra_clk_audio4_mux] =3D { .dt_id =3D TEGRA210_CLK_AUDIO4_MUX, .present= =3D true }, + [tegra_clk_spdif_mux] =3D { .dt_id =3D TEGRA210_CLK_SPDIF_MUX, .present = =3D true }, + [tegra_clk_maud] =3D { .dt_id =3D TEGRA210_CLK_MAUD, .present =3D true }, + [tegra_clk_mipibif] =3D { .dt_id =3D TEGRA210_CLK_MIPIBIF, .present =3D t= rue }, + [tegra_clk_qspi] =3D { .dt_id =3D TEGRA210_CLK_QSPI, .present =3D true }, + [tegra_clk_sdmmc_legacy] =3D { .dt_id =3D TEGRA210_CLK_SDMMC_LEGACY, .pre= sent =3D true }, + [tegra_clk_tsecb] =3D { .dt_id =3D TEGRA210_CLK_TSECB, .present =3D true = }, + [tegra_clk_uartape] =3D { .dt_id =3D TEGRA210_CLK_UARTAPE, .present =3D t= rue }, + [tegra_clk_vi_i2c] =3D { .dt_id =3D TEGRA210_CLK_VI_I2C, .present =3D tru= e }, + [tegra_clk_ape] =3D { .dt_id =3D TEGRA210_CLK_APE, .present =3D true }, + [tegra_clk_dbgapb] =3D { .dt_id =3D TEGRA210_CLK_DBGAPB, .present =3D tru= e }, + [tegra_clk_nvdec] =3D { .dt_id =3D TEGRA210_CLK_NVDEC, .present =3D true = }, + [tegra_clk_nvenc] =3D { .dt_id =3D TEGRA210_CLK_NVENC, .present =3D true = }, + [tegra_clk_nvjpg] =3D { .dt_id =3D TEGRA210_CLK_NVJPG, .present =3D true = }, + [tegra_clk_pll_c4_out0] =3D { .dt_id =3D TEGRA210_CLK_PLL_C4_OUT0, .prese= nt =3D true }, + [tegra_clk_pll_c4_out1] =3D { .dt_id =3D TEGRA210_CLK_PLL_C4_OUT1, .prese= nt =3D true }, + [tegra_clk_pll_c4_out2] =3D { .dt_id =3D TEGRA210_CLK_PLL_C4_OUT2, .prese= nt =3D true }, + [tegra_clk_pll_c4_out3] =3D { .dt_id =3D TEGRA210_CLK_PLL_C4_OUT3, .prese= nt =3D true }, + [tegra_clk_apb2ape] =3D { .dt_id =3D TEGRA210_CLK_APB2APE, .present =3D t= rue }, + [tegra_clk_pll_a1] =3D { .dt_id =3D TEGRA210_CLK_PLL_A1, .present =3D tru= e }, + [tegra_clk_ispa] =3D { .dt_id =3D TEGRA210_CLK_ISPA, .present =3D true }, + [tegra_clk_cec] =3D { .dt_id =3D TEGRA210_CLK_CEC, .present =3D true }, + [tegra_clk_dmic1] =3D { .dt_id =3D TEGRA210_CLK_DMIC1, .present =3D true = }, + [tegra_clk_dmic2] =3D { .dt_id =3D TEGRA210_CLK_DMIC2, .present =3D true = }, + [tegra_clk_dmic3] =3D { .dt_id =3D TEGRA210_CLK_DMIC3, .present =3D true = }, + [tegra_clk_dmic1_sync_clk] =3D { .dt_id =3D TEGRA210_CLK_DMIC1_SYNC_CLK, = .present =3D true }, + [tegra_clk_dmic2_sync_clk] =3D { .dt_id =3D TEGRA210_CLK_DMIC2_SYNC_CLK, = .present =3D true }, + [tegra_clk_dmic3_sync_clk] =3D { .dt_id =3D TEGRA210_CLK_DMIC3_SYNC_CLK, = .present =3D true }, + [tegra_clk_dmic1_sync_clk_mux] =3D { .dt_id =3D TEGRA210_CLK_DMIC1_SYNC_C= LK_MUX, .present =3D true }, + [tegra_clk_dmic2_sync_clk_mux] =3D { .dt_id =3D TEGRA210_CLK_DMIC2_SYNC_C= LK_MUX, .present =3D true }, + [tegra_clk_dmic3_sync_clk_mux] =3D { .dt_id =3D TEGRA210_CLK_DMIC3_SYNC_C= LK_MUX, .present =3D true }, + [tegra_clk_dp2] =3D { .dt_id =3D TEGRA210_CLK_DP2, .present =3D true }, + [tegra_clk_iqc1] =3D { .dt_id =3D TEGRA210_CLK_IQC1, .present =3D true }, + [tegra_clk_iqc2] =3D { .dt_id =3D TEGRA210_CLK_IQC2, .present =3D true }, + [tegra_clk_pll_a_out_adsp] =3D { .dt_id =3D TEGRA210_CLK_PLL_A_OUT_ADSP, = .present =3D true }, + [tegra_clk_pll_a_out0_out_adsp] =3D { .dt_id =3D TEGRA210_CLK_PLL_A_OUT0_= OUT_ADSP, .present =3D true }, + [tegra_clk_adsp] =3D { .dt_id =3D TEGRA210_CLK_ADSP, .present =3D true }, + [tegra_clk_adsp_neon] =3D { .dt_id =3D TEGRA210_CLK_ADSP_NEON, .present = =3D true }, +}; + +static struct tegra_devclk devclks[] __initdata =3D { + { .con_id =3D "clk_m", .dt_id =3D TEGRA210_CLK_CLK_M }, + { .con_id =3D "pll_ref", .dt_id =3D TEGRA210_CLK_PLL_REF }, + { .con_id =3D "clk_32k", .dt_id =3D TEGRA210_CLK_CLK_32K }, + { .con_id =3D "osc", .dt_id =3D TEGRA210_CLK_OSC }, + { .con_id =3D "osc_div2", .dt_id =3D TEGRA210_CLK_OSC_DIV2 }, + { .con_id =3D "osc_div4", .dt_id =3D TEGRA210_CLK_OSC_DIV4 }, + { .con_id =3D "pll_c", .dt_id =3D TEGRA210_CLK_PLL_C }, + { .con_id =3D "pll_c_out1", .dt_id =3D TEGRA210_CLK_PLL_C_OUT1 }, + { .con_id =3D "pll_c2", .dt_id =3D TEGRA210_CLK_PLL_C2 }, + { .con_id =3D "pll_c3", .dt_id =3D TEGRA210_CLK_PLL_C3 }, + { .con_id =3D "pll_p", .dt_id =3D TEGRA210_CLK_PLL_P }, + { .con_id =3D "pll_p_out1", .dt_id =3D TEGRA210_CLK_PLL_P_OUT1 }, + { .con_id =3D "pll_p_out2", .dt_id =3D TEGRA210_CLK_PLL_P_OUT2 }, + { .con_id =3D "pll_p_out3", .dt_id =3D TEGRA210_CLK_PLL_P_OUT3 }, + { .con_id =3D "pll_p_out4", .dt_id =3D TEGRA210_CLK_PLL_P_OUT4 }, + { .con_id =3D "pll_m", .dt_id =3D TEGRA210_CLK_PLL_M }, + { .con_id =3D "pll_x", .dt_id =3D TEGRA210_CLK_PLL_X }, + { .con_id =3D "pll_x_out0", .dt_id =3D TEGRA210_CLK_PLL_X_OUT0 }, + { .con_id =3D "pll_u", .dt_id =3D TEGRA210_CLK_PLL_U }, + { .con_id =3D "pll_u_out", .dt_id =3D TEGRA210_CLK_PLL_U_OUT }, + { .con_id =3D "pll_u_out1", .dt_id =3D TEGRA210_CLK_PLL_U_OUT1 }, + { .con_id =3D "pll_u_out2", .dt_id =3D TEGRA210_CLK_PLL_U_OUT2 }, + { .con_id =3D "pll_u_480M", .dt_id =3D TEGRA210_CLK_PLL_U_480M }, + { .con_id =3D "pll_u_60M", .dt_id =3D TEGRA210_CLK_PLL_U_60M }, + { .con_id =3D "pll_u_48M", .dt_id =3D TEGRA210_CLK_PLL_U_48M }, + { .con_id =3D "pll_d", .dt_id =3D TEGRA210_CLK_PLL_D }, + { .con_id =3D "pll_d_out0", .dt_id =3D TEGRA210_CLK_PLL_D_OUT0 }, + { .con_id =3D "pll_d2", .dt_id =3D TEGRA210_CLK_PLL_D2 }, + { .con_id =3D "pll_d2_out0", .dt_id =3D TEGRA210_CLK_PLL_D2_OUT0 }, + { .con_id =3D "pll_a", .dt_id =3D TEGRA210_CLK_PLL_A }, + { .con_id =3D "pll_a_out0", .dt_id =3D TEGRA210_CLK_PLL_A_OUT0 }, + { .con_id =3D "pll_re_vco", .dt_id =3D TEGRA210_CLK_PLL_RE_VCO }, + { .con_id =3D "pll_re_out", .dt_id =3D TEGRA210_CLK_PLL_RE_OUT }, + { .con_id =3D "spdif_in_sync", .dt_id =3D TEGRA210_CLK_SPDIF_IN_SYNC }, + { .con_id =3D "i2s0_sync", .dt_id =3D TEGRA210_CLK_I2S0_SYNC }, + { .con_id =3D "i2s1_sync", .dt_id =3D TEGRA210_CLK_I2S1_SYNC }, + { .con_id =3D "i2s2_sync", .dt_id =3D TEGRA210_CLK_I2S2_SYNC }, + { .con_id =3D "i2s3_sync", .dt_id =3D TEGRA210_CLK_I2S3_SYNC }, + { .con_id =3D "i2s4_sync", .dt_id =3D TEGRA210_CLK_I2S4_SYNC }, + { .con_id =3D "vimclk_sync", .dt_id =3D TEGRA210_CLK_VIMCLK_SYNC }, + { .con_id =3D "audio0", .dt_id =3D TEGRA210_CLK_AUDIO0 }, + { .con_id =3D "audio1", .dt_id =3D TEGRA210_CLK_AUDIO1 }, + { .con_id =3D "audio2", .dt_id =3D TEGRA210_CLK_AUDIO2 }, + { .con_id =3D "audio3", .dt_id =3D TEGRA210_CLK_AUDIO3 }, + { .con_id =3D "audio4", .dt_id =3D TEGRA210_CLK_AUDIO4 }, + { .con_id =3D "spdif", .dt_id =3D TEGRA210_CLK_SPDIF }, + { .con_id =3D "spdif_2x", .dt_id =3D TEGRA210_CLK_SPDIF_2X }, + { .con_id =3D "extern1", .dt_id =3D TEGRA210_CLK_EXTERN1 }, + { .con_id =3D "extern2", .dt_id =3D TEGRA210_CLK_EXTERN2 }, + { .con_id =3D "extern3", .dt_id =3D TEGRA210_CLK_EXTERN3 }, + { .con_id =3D "cclk_g", .dt_id =3D TEGRA210_CLK_CCLK_G }, + { .con_id =3D "cclk_lp", .dt_id =3D TEGRA210_CLK_CCLK_LP }, + { .con_id =3D "sclk", .dt_id =3D TEGRA210_CLK_SCLK }, + { .con_id =3D "hclk", .dt_id =3D TEGRA210_CLK_HCLK }, + { .con_id =3D "pclk", .dt_id =3D TEGRA210_CLK_PCLK }, + { .con_id =3D "fuse", .dt_id =3D TEGRA210_CLK_FUSE }, + { .dev_id =3D "rtc-tegra", .dt_id =3D TEGRA210_CLK_RTC }, + { .dev_id =3D "timer", .dt_id =3D TEGRA210_CLK_TIMER }, + { .con_id =3D "pll_c4_out0", .dt_id =3D TEGRA210_CLK_PLL_C4_OUT0 }, + { .con_id =3D "pll_c4_out1", .dt_id =3D TEGRA210_CLK_PLL_C4_OUT1 }, + { .con_id =3D "pll_c4_out2", .dt_id =3D TEGRA210_CLK_PLL_C4_OUT2 }, + { .con_id =3D "pll_c4_out3", .dt_id =3D TEGRA210_CLK_PLL_C4_OUT3 }, + { .con_id =3D "dpaux", .dt_id =3D TEGRA210_CLK_DPAUX }, +}; + +static struct tegra_audio_clk_info tegra210_audio_plls[] =3D { + { "pll_a", &pll_a_params, tegra_clk_pll_a, "pll_ref" }, + { "pll_a1", &pll_a1_params, tegra_clk_pll_a1, "pll_ref" }, +}; + +static const char * const aclk_parents[] =3D { + "pll_a1", "pll_c", "pll_p", "pll_a_out0", "pll_c2", "pll_c3", + "clk_m" +}; + +static const unsigned int nvjpg_slcg_clkids[] =3D { TEGRA210_CLK_NVDEC }; +static const unsigned int nvdec_slcg_clkids[] =3D { TEGRA210_CLK_NVJPG }; +static const unsigned int sor_slcg_clkids[] =3D { TEGRA210_CLK_HDA2CODEC_2= X, + TEGRA210_CLK_HDA2HDMI, TEGRA210_CLK_DISP1, TEGRA210_CLK_DISP2 }; +static const unsigned int disp_slcg_clkids[] =3D { TEGRA210_CLK_LA, + TEGRA210_CLK_HOST1X}; +static const unsigned int xusba_slcg_clkids[] =3D { TEGRA210_CLK_XUSB_HOST, + TEGRA210_CLK_XUSB_DEV }; +static const unsigned int xusbb_slcg_clkids[] =3D { TEGRA210_CLK_XUSB_HOST, + TEGRA210_CLK_XUSB_SS }; +static const unsigned int xusbc_slcg_clkids[] =3D { TEGRA210_CLK_XUSB_DEV, + TEGRA210_CLK_XUSB_SS }; +static const unsigned int venc_slcg_clkids[] =3D { TEGRA210_CLK_HOST1X, + TEGRA210_CLK_PLL_D }; +static const unsigned int ape_slcg_clkids[] =3D { TEGRA210_CLK_ACLK, + TEGRA210_CLK_I2S0, TEGRA210_CLK_I2S1, TEGRA210_CLK_I2S2, + TEGRA210_CLK_I2S3, TEGRA210_CLK_I2S4, TEGRA210_CLK_SPDIF_OUT, + TEGRA210_CLK_D_AUDIO }; +static const unsigned int vic_slcg_clkids[] =3D { TEGRA210_CLK_HOST1X }; + +static struct tegra210_domain_mbist_war tegra210_pg_mbist_war[] =3D { + [TEGRA_POWERGATE_VENC] =3D { + .handle_lvl2_ovr =3D tegra210_venc_mbist_war, + .num_clks =3D ARRAY_SIZE(venc_slcg_clkids), + .clk_init_data =3D venc_slcg_clkids, + }, + [TEGRA_POWERGATE_SATA] =3D { + .handle_lvl2_ovr =3D tegra210_generic_mbist_war, + .lvl2_offset =3D LVL2_CLK_GATE_OVRC, + .lvl2_mask =3D BIT(0) | BIT(17) | BIT(19), + }, + [TEGRA_POWERGATE_MPE] =3D { + .handle_lvl2_ovr =3D tegra210_generic_mbist_war, + .lvl2_offset =3D LVL2_CLK_GATE_OVRE, + .lvl2_mask =3D BIT(29), + }, + [TEGRA_POWERGATE_SOR] =3D { + .handle_lvl2_ovr =3D tegra210_generic_mbist_war, + .num_clks =3D ARRAY_SIZE(sor_slcg_clkids), + .clk_init_data =3D sor_slcg_clkids, + .lvl2_offset =3D LVL2_CLK_GATE_OVRA, + .lvl2_mask =3D BIT(1) | BIT(2), + }, + [TEGRA_POWERGATE_DIS] =3D { + .handle_lvl2_ovr =3D tegra210_disp_mbist_war, + .num_clks =3D ARRAY_SIZE(disp_slcg_clkids), + .clk_init_data =3D disp_slcg_clkids, + }, + [TEGRA_POWERGATE_DISB] =3D { + .num_clks =3D ARRAY_SIZE(disp_slcg_clkids), + .clk_init_data =3D disp_slcg_clkids, + .handle_lvl2_ovr =3D tegra210_generic_mbist_war, + .lvl2_offset =3D LVL2_CLK_GATE_OVRA, + .lvl2_mask =3D BIT(2), + }, + [TEGRA_POWERGATE_XUSBA] =3D { + .num_clks =3D ARRAY_SIZE(xusba_slcg_clkids), + .clk_init_data =3D xusba_slcg_clkids, + .handle_lvl2_ovr =3D tegra210_generic_mbist_war, + .lvl2_offset =3D LVL2_CLK_GATE_OVRC, + .lvl2_mask =3D BIT(30) | BIT(31), + }, + [TEGRA_POWERGATE_XUSBB] =3D { + .num_clks =3D ARRAY_SIZE(xusbb_slcg_clkids), + .clk_init_data =3D xusbb_slcg_clkids, + .handle_lvl2_ovr =3D tegra210_generic_mbist_war, + .lvl2_offset =3D LVL2_CLK_GATE_OVRC, + .lvl2_mask =3D BIT(30) | BIT(31), + }, + [TEGRA_POWERGATE_XUSBC] =3D { + .num_clks =3D ARRAY_SIZE(xusbc_slcg_clkids), + .clk_init_data =3D xusbc_slcg_clkids, + .handle_lvl2_ovr =3D tegra210_generic_mbist_war, + .lvl2_offset =3D LVL2_CLK_GATE_OVRC, + .lvl2_mask =3D BIT(30) | BIT(31), + }, + [TEGRA_POWERGATE_VIC] =3D { + .num_clks =3D ARRAY_SIZE(vic_slcg_clkids), + .clk_init_data =3D vic_slcg_clkids, + .handle_lvl2_ovr =3D tegra210_vic_mbist_war, + }, + [TEGRA_POWERGATE_NVDEC] =3D { + .num_clks =3D ARRAY_SIZE(nvdec_slcg_clkids), + .clk_init_data =3D nvdec_slcg_clkids, + .handle_lvl2_ovr =3D tegra210_generic_mbist_war, + .lvl2_offset =3D LVL2_CLK_GATE_OVRE, + .lvl2_mask =3D BIT(9) | BIT(31), + }, + [TEGRA_POWERGATE_NVJPG] =3D { + .num_clks =3D ARRAY_SIZE(nvjpg_slcg_clkids), + .clk_init_data =3D nvjpg_slcg_clkids, + .handle_lvl2_ovr =3D tegra210_generic_mbist_war, + .lvl2_offset =3D LVL2_CLK_GATE_OVRE, + .lvl2_mask =3D BIT(9) | BIT(31), + }, + [TEGRA_POWERGATE_AUD] =3D { + .num_clks =3D ARRAY_SIZE(ape_slcg_clkids), + .clk_init_data =3D ape_slcg_clkids, + .handle_lvl2_ovr =3D tegra210_ape_mbist_war, + }, + [TEGRA_POWERGATE_VE2] =3D { + .handle_lvl2_ovr =3D tegra210_generic_mbist_war, + .lvl2_offset =3D LVL2_CLK_GATE_OVRD, + .lvl2_mask =3D BIT(22), + }, +}; + +static void tegra210_utmi_param_configure(void) +{ + u32 reg; + int i; + + for (i =3D 0; i < ARRAY_SIZE(utmi_parameters); i++) { + if (osc_freq =3D=3D utmi_parameters[i].osc_frequency) + break; + } + + if (i >=3D ARRAY_SIZE(utmi_parameters)) { + pr_err("%s: Unexpected oscillator freq %lu\n", __func__, + osc_freq); + return; + } + + reg =3D readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0); + reg &=3D ~UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE; + writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0); + + udelay(10); + + reg =3D readl_relaxed(clk_base + UTMIP_PLL_CFG2); + + /* Program UTMIP PLL stable and active counts */ + /* [FIXME] arclk_rst.h says WRONG! This should be 1ms -> 0x50 Check! */ + reg &=3D ~UTMIP_PLL_CFG2_STABLE_COUNT(~0); + reg |=3D UTMIP_PLL_CFG2_STABLE_COUNT(utmi_parameters[i].stable_count); + + reg &=3D ~UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(~0); + reg |=3D + UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(utmi_parameters[i].active_delay_count); + writel_relaxed(reg, clk_base + UTMIP_PLL_CFG2); + + /* Program UTMIP PLL delay and oscillator frequency counts */ + reg =3D readl_relaxed(clk_base + UTMIP_PLL_CFG1); + + reg &=3D ~UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(~0); + reg |=3D + UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(utmi_parameters[i].enable_delay_count); + + reg &=3D ~UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(~0); + reg |=3D + UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(utmi_parameters[i].xtal_freq_count); + + reg |=3D UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN; + writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1); + + /* Remove power downs from UTMIP PLL control bits */ + reg =3D readl_relaxed(clk_base + UTMIP_PLL_CFG1); + reg &=3D ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN; + reg |=3D UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP; + writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1); + + udelay(20); + + /* Enable samplers for SNPS, XUSB_HOST, XUSB_DEV */ + reg =3D readl_relaxed(clk_base + UTMIP_PLL_CFG2); + reg |=3D UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERUP; + reg |=3D UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERUP; + reg |=3D UTMIP_PLL_CFG2_FORCE_PD_SAMP_D_POWERUP; + reg &=3D ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN; + reg &=3D ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN; + reg &=3D ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_D_POWERDOWN; + writel_relaxed(reg, clk_base + UTMIP_PLL_CFG2); +} + +static void tegra210_utmi_hw_sequencer_enable(void) +{ + u32 reg; + + /* Setup HW control of UTMIPLL */ + reg =3D readl_relaxed(clk_base + UTMIP_PLL_CFG1); + reg &=3D ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN; + reg &=3D ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP; + writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1); + + reg =3D readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0); + reg |=3D UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET; + reg &=3D ~UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL; + writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0); + + udelay(1); + + reg =3D readl_relaxed(clk_base + XUSB_PLL_CFG0); + reg &=3D ~XUSB_PLL_CFG0_UTMIPLL_LOCK_DLY; + writel_relaxed(reg, clk_base + XUSB_PLL_CFG0); + + udelay(1); + + /* Enable HW control UTMIPLL */ + reg =3D readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0); + reg |=3D UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE; + writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0); + + udelay(1); +} + +static int tegra210_enable_utmipll(void) +{ + u32 reg =3D readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0); + bool hw_on =3D reg & UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE; + bool locked =3D reg & UTMIPLL_HW_PWRDN_CFG0_UTMIPLL_LOCK; + + pr_info_once("%s: hw %s, lock %s, use_pllre %s\n", __func__, + hw_on ? "ON" : "OFF", locked ? "1" : "0", + pll_re_use_utmipll ? "YES" : "NO"); + + if (hw_on) { + if (pll_re_use_utmipll || utmipll_set_defaults(true)) { + WARN(1, "UTMIP PLL: hw is ON with invalid %s\n", + pll_re_use_utmipll ? "PLLRE usage" : "M/N values"); + return -EINVAL; + } + return 0; + } + + if (utmipll_set_defaults(locked)) { + WARN_ON(1); + return -EINVAL; + } + + if (!locked) + tegra210_utmi_param_configure(); + + if (!pll_re_use_utmipll) + tegra210_utmi_hw_sequencer_enable(); + + return 0; +} + +static int tegra210_enable_pllu(void) +{ + struct tegra_clk_pll_freq_table *fentry; + struct tegra_clk_pll pllu; + u32 reg; + int ret; + + for (fentry =3D pll_u_freq_table; fentry->input_rate; fentry++) { + if (fentry->input_rate =3D=3D pll_ref_freq) + break; + } + + if (!fentry->input_rate) { + pr_err("Unknown PLL_U reference frequency %lu\n", pll_ref_freq); + return -EINVAL; + } + + /* clear IDDQ bit */ + pllu.params =3D &pll_u_vco_params; + reg =3D readl_relaxed(clk_base + pllu.params->ext_misc_reg[0]); + reg &=3D ~BIT(pllu.params->iddq_bit_idx); + writel_relaxed(reg, clk_base + pllu.params->ext_misc_reg[0]); + fence_udelay(5, clk_base); + + reg =3D readl_relaxed(clk_base + PLLU_BASE); + reg &=3D ~GENMASK(20, 0); + reg |=3D fentry->m; + reg |=3D fentry->n << 8; + reg |=3D fentry->p << 16; + writel(reg, clk_base + PLLU_BASE); + fence_udelay(1, clk_base); + reg |=3D PLL_ENABLE; + writel(reg, clk_base + PLLU_BASE); + fence_udelay(1, clk_base); + + /* + * During clocks resume, same PLLU init and enable sequence get + * executed. So, readx_poll_timeout_atomic can't be used here as it + * uses ktime_get() and timekeeping resume doesn't happen by that + * time. So, using tegra210_wait_for_mask for PLL LOCK. + */ + ret =3D tegra210_wait_for_mask(&pllu, PLLU_BASE, PLL_BASE_LOCK); + if (ret) { + pr_err("Timed out waiting for PLL_U to lock\n"); + return -ETIMEDOUT; + } + + return 0; +} + +static int tegra210_init_pllu(void) +{ + u32 reg; + int err; + struct tegra_clk_pll pllu; + struct tegra_clk_pll *p =3D &pllu; + + tegra210_pllu_set_defaults(&pll_u_vco_params); + reg =3D readl_relaxed(clk_base + PLLU_BASE); + + /* PLLU is modeled as fixed clock source - must have default MNP */ + pllu.params =3D &pll_u_vco_params; + if ((reg & (divm_mask_shifted(p) | divn_mask_shifted(p) | + divp_mask_shifted(p))) !=3D PLLU_BASE_MNP_DEFAULT_VALUE) { + WARN_ON(1); + return -EINVAL; + } + + /* skip initialization when pllu is in hw controlled mode */ + if (reg & PLLU_BASE_OVERRIDE) { + if (!(reg & PLL_ENABLE)) { + err =3D tegra210_enable_pllu(); + if (err < 0) { + WARN_ON(1); + return err; + } + } + /* enable hw controlled mode */ + reg =3D readl_relaxed(clk_base + PLLU_BASE); + reg &=3D ~PLLU_BASE_OVERRIDE; + writel(reg, clk_base + PLLU_BASE); + + reg =3D readl_relaxed(clk_base + PLLU_HW_PWRDN_CFG0); + reg |=3D PLLU_HW_PWRDN_CFG0_USE_SWITCH_DETECT | + PLLU_HW_PWRDN_CFG0_USE_LOCKDET; + reg &=3D ~(PLLU_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL | + PLLU_HW_PWRDN_CFG0_IDDQ_PD_INCLUDE | + PLLU_HW_PWRDN_CFG0_CLK_SWITCH_SWCTL); + writel_relaxed(reg, clk_base + PLLU_HW_PWRDN_CFG0); + + reg =3D readl_relaxed(clk_base + XUSB_PLL_CFG0); + reg &=3D ~XUSB_PLL_CFG0_PLLU_LOCK_DLY_MASK; + writel_relaxed(reg, clk_base + XUSB_PLL_CFG0); + fence_udelay(1, clk_base); + + reg =3D readl_relaxed(clk_base + PLLU_HW_PWRDN_CFG0); + reg |=3D PLLU_HW_PWRDN_CFG0_SEQ_ENABLE; + writel_relaxed(reg, clk_base + PLLU_HW_PWRDN_CFG0); + fence_udelay(1, clk_base); + + reg =3D readl_relaxed(clk_base + PLLU_BASE); + reg &=3D ~PLLU_BASE_CLKENABLE_USB; + writel_relaxed(reg, clk_base + PLLU_BASE); + } else if (!(reg & PLL_ENABLE)) { + WARN(1, "Disabled PLLU was put under h/w control\n"); + } + + /* enable UTMIPLL hw control if not yet done by the bootloader */ + return tegra210_enable_utmipll(); +} + +/* + * The SOR hardware blocks are driven by two clocks: a module clock that is + * used to access registers and a pixel clock that is sourced from the same + * pixel clock that also drives the head attached to the SOR. The module + * clock is typically called sorX (with X being the SOR instance) and the + * pixel clock is called sorX_out. The source for the SOR pixel clock is + * referred to as the "parent" clock. + * + * On Tegra186 and newer, clocks are provided by the BPMP. Unfortunately t= he + * BPMP implementation for the SOR clocks doesn't exactly match the above = in + * some aspects. For example, the SOR module is really clocked by the pad = or + * sor_safe clocks, but BPMP models the sorX clock as being sourced by the + * pixel clocks. Conversely the sorX_out clock is sourced by the sor_safe = or + * pad clocks on BPMP. + * + * In order to allow the display driver to deal with all SoC generations in + * a unified way, implement the BPMP semantics in this driver. + */ + +static const char * const sor0_parents[] =3D { + "pll_d_out0", +}; + +static const char * const sor0_out_parents[] =3D { + "sor_safe", "sor0_pad_clkout", +}; + +static const char * const sor1_parents[] =3D { + "pll_p", "pll_d_out0", "pll_d2_out0", "clk_m", +}; + +static u32 sor1_parents_idx[] =3D { 0, 2, 5, 6 }; + +static const struct clk_div_table mc_div_table_tegra210[] =3D { + { .val =3D 0, .div =3D 2 }, + { .val =3D 1, .div =3D 4 }, + { .val =3D 2, .div =3D 1 }, + { .val =3D 3, .div =3D 2 }, + { .val =3D 0, .div =3D 0 }, +}; + +static void tegra210_clk_register_mc(const char *name, + const char *parent_name) +{ + struct clk *clk; + + clk =3D clk_register_divider_table(NULL, name, parent_name, + CLK_IS_CRITICAL, + clk_base + CLK_SOURCE_EMC, + 15, 2, CLK_DIVIDER_READ_ONLY, + mc_div_table_tegra210, &emc_lock); + clks[TEGRA210_CLK_MC] =3D clk; +} + +static const char * const sor1_out_parents[] =3D { + /* + * Bit 0 of the mux selects sor1_pad_clkout, irrespective of bit 1, so + * the sor1_pad_clkout parent appears twice in the list below. This is + * merely to support clk_get_parent() if firmware happened to set + * these bits to 0b11. While not an invalid setting, code should + * always set the bits to 0b01 to select sor1_pad_clkout. + */ + "sor_safe", "sor1_pad_clkout", "sor1_out", "sor1_pad_clkout", +}; + +static struct tegra_periph_init_data tegra210_periph[] =3D { + /* + * On Tegra210, the sor0 clock doesn't have a mux it bitfield 31:29, + * but it is hardwired to the pll_d_out0 clock. + */ + TEGRA_INIT_DATA_TABLE("sor0", NULL, NULL, sor0_parents, + CLK_SOURCE_SOR0, 29, 0x0, 0, 0, 0, 0, + 0, 182, 0, tegra_clk_sor0, NULL, 0, + &sor0_lock), + TEGRA_INIT_DATA_TABLE("sor0_out", NULL, NULL, sor0_out_parents, + CLK_SOURCE_SOR0, 14, 0x1, 0, 0, 0, 0, + 0, 0, TEGRA_PERIPH_NO_GATE, tegra_clk_sor0_out, + NULL, 0, &sor0_lock), + TEGRA_INIT_DATA_TABLE("sor1", NULL, NULL, sor1_parents, + CLK_SOURCE_SOR1, 29, 0x7, 0, 0, 8, 1, + TEGRA_DIVIDER_ROUND_UP, 183, 0, + tegra_clk_sor1, sor1_parents_idx, 0, + &sor1_lock), + TEGRA_INIT_DATA_TABLE("sor1_out", NULL, NULL, sor1_out_parents, + CLK_SOURCE_SOR1, 14, 0x3, 0, 0, 0, 0, + 0, 0, TEGRA_PERIPH_NO_GATE, + tegra_clk_sor1_out, NULL, 0, &sor1_lock), +}; + +static const char * const la_parents[] =3D { + "pll_p", "pll_c2", "pll_c", "pll_c3", "pll_re_out1", "pll_a1", "clk_m", "= pll_c4_out0" +}; + +static struct tegra_clk_periph tegra210_la =3D + TEGRA_CLK_PERIPH(29, 7, 9, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP, 76, 0, NULL, = NULL); + +static __init void tegra210_periph_clk_init(struct device_node *np, + void __iomem *clk_base, + void __iomem *pmc_base) +{ + struct clk *clk; + unsigned int i; + + /* xusb_ss_div2 */ + clk =3D clk_register_fixed_factor(NULL, "xusb_ss_div2", "xusb_ss_src", 0, + 1, 2); + clks[TEGRA210_CLK_XUSB_SS_DIV2] =3D clk; + + clk =3D tegra_clk_register_periph_fixed("sor_safe", "pll_p", 0, clk_base, + 1, 17, 222); + clks[TEGRA210_CLK_SOR_SAFE] =3D clk; + + clk =3D tegra_clk_register_periph_fixed("dpaux", "sor_safe", 0, clk_base, + 1, 17, 181); + clks[TEGRA210_CLK_DPAUX] =3D clk; + + clk =3D tegra_clk_register_periph_fixed("dpaux1", "sor_safe", 0, clk_base, + 1, 17, 207); + clks[TEGRA210_CLK_DPAUX1] =3D clk; + + /* pll_d_dsi_out */ + clk =3D clk_register_gate(NULL, "pll_d_dsi_out", "pll_d_out0", 0, + clk_base + PLLD_MISC0, 21, 0, &pll_d_lock); + clks[TEGRA210_CLK_PLL_D_DSI_OUT] =3D clk; + + /* dsia */ + clk =3D tegra_clk_register_periph_gate("dsia", "pll_d_dsi_out", 0, + clk_base, 0, 48, + periph_clk_enb_refcnt); + clks[TEGRA210_CLK_DSIA] =3D clk; + + /* dsib */ + clk =3D tegra_clk_register_periph_gate("dsib", "pll_d_dsi_out", 0, + clk_base, 0, 82, + periph_clk_enb_refcnt); + clks[TEGRA210_CLK_DSIB] =3D clk; + + /* csi_tpg */ + clk =3D clk_register_gate(NULL, "csi_tpg", "pll_d", + CLK_SET_RATE_PARENT, clk_base + PLLD_BASE, + 23, 0, &pll_d_lock); + clk_register_clkdev(clk, "csi_tpg", NULL); + clks[TEGRA210_CLK_CSI_TPG] =3D clk; + + /* la */ + clk =3D tegra_clk_register_periph("la", la_parents, + ARRAY_SIZE(la_parents), &tegra210_la, clk_base, + CLK_SOURCE_LA, 0); + clks[TEGRA210_CLK_LA] =3D clk; + + /* cml0 */ + clk =3D clk_register_gate(NULL, "cml0", "pll_e", 0, clk_base + PLLE_AUX, + 0, 0, &pll_e_lock); + clk_register_clkdev(clk, "cml0", NULL); + clks[TEGRA210_CLK_CML0] =3D clk; + + /* cml1 */ + clk =3D clk_register_gate(NULL, "cml1", "pll_e", 0, clk_base + PLLE_AUX, + 1, 0, &pll_e_lock); + clk_register_clkdev(clk, "cml1", NULL); + clks[TEGRA210_CLK_CML1] =3D clk; + + clk =3D tegra_clk_register_super_clk("aclk", aclk_parents, + ARRAY_SIZE(aclk_parents), 0, clk_base + 0x6e0, + 0, NULL); + clks[TEGRA210_CLK_ACLK] =3D clk; + + clk =3D tegra_clk_register_sdmmc_mux_div("sdmmc2", clk_base, + CLK_SOURCE_SDMMC2, 9, + TEGRA_DIVIDER_ROUND_UP, 0, NULL); + clks[TEGRA210_CLK_SDMMC2] =3D clk; + + clk =3D tegra_clk_register_sdmmc_mux_div("sdmmc4", clk_base, + CLK_SOURCE_SDMMC4, 15, + TEGRA_DIVIDER_ROUND_UP, 0, NULL); + clks[TEGRA210_CLK_SDMMC4] =3D clk; + + for (i =3D 0; i < ARRAY_SIZE(tegra210_periph); i++) { + struct tegra_periph_init_data *init =3D &tegra210_periph[i]; + struct clk **clkp; + + clkp =3D tegra_lookup_dt_id(init->clk_id, tegra210_clks); + if (!clkp) { + pr_warn("clock %u not found\n", init->clk_id); + continue; + } + + clk =3D tegra_clk_register_periph_data(clk_base, init); + *clkp =3D clk; + } + + tegra_periph_clk_init(clk_base, pmc_base, tegra210_clks, &pll_p_params); + + /* mc */ + tegra210_clk_register_mc("mc", "emc"); +} + +static void __init tegra210_pll_init(void __iomem *clk_base, + void __iomem *pmc) +{ + struct clk *clk; + + /* PLL_RE reference clock must be selected by boot-loader */ + pll_re_use_utmipll =3D readl_relaxed(clk_base + PLLRE_BASE) & + PLLRE_BASE_CLKIN_SEL; + + /* PLLC */ + clk =3D tegra_clk_register_pllc_tegra210("pll_c", "pll_ref", clk_base, + pmc, 0, &pll_c_params, NULL); + if (!WARN_ON(IS_ERR(clk))) + clk_register_clkdev(clk, "pll_c", NULL); + clks[TEGRA210_CLK_PLL_C] =3D clk; + + /* PLLC_OUT1 */ + clk =3D tegra_clk_register_divider("pll_c_out1_div", "pll_c", + clk_base + PLLC_OUT, 0, TEGRA_DIVIDER_ROUND_UP, + 8, 8, 1, NULL); + clk =3D tegra_clk_register_pll_out("pll_c_out1", "pll_c_out1_div", + clk_base + PLLC_OUT, 1, 0, + CLK_SET_RATE_PARENT, 0, NULL); + clk_register_clkdev(clk, "pll_c_out1", NULL); + clks[TEGRA210_CLK_PLL_C_OUT1] =3D clk; + + /* PLLC_UD */ + clk =3D clk_register_fixed_factor(NULL, "pll_c_ud", "pll_c", + CLK_SET_RATE_PARENT, 1, 1); + clk_register_clkdev(clk, "pll_c_ud", NULL); + clks[TEGRA210_CLK_PLL_C_UD] =3D clk; + + /* PLLC2 */ + clk =3D tegra_clk_register_pllc_tegra210("pll_c2", "pll_ref", clk_base, + pmc, 0, &pll_c2_params, NULL); + clk_register_clkdev(clk, "pll_c2", NULL); + clks[TEGRA210_CLK_PLL_C2] =3D clk; + + /* PLLC3 */ + clk =3D tegra_clk_register_pllc_tegra210("pll_c3", "pll_ref", clk_base, + pmc, 0, &pll_c3_params, NULL); + clk_register_clkdev(clk, "pll_c3", NULL); + clks[TEGRA210_CLK_PLL_C3] =3D clk; + + /* PLLU_VCO */ + if (!tegra210_init_pllu()) { + clk =3D clk_register_fixed_rate(NULL, "pll_u_vco", "pll_ref", 0, + 480*1000*1000); + clk_register_clkdev(clk, "pll_u_vco", NULL); + clks[TEGRA210_CLK_PLL_U] =3D clk; + + /* PLLU_OUT */ + clk =3D clk_register_fixed_factor(NULL, "pll_u_out", "pll_u_vco", + CLK_SET_RATE_PARENT, 1, 2); + clk_register_clkdev(clk, "pll_u_out", NULL); + clks[TEGRA210_CLK_PLL_U_OUT] =3D clk; + + /* UTMIPLL_60M */ + clk =3D clk_register_fixed_rate(NULL, "utmipll_60M", "pll_ref", 0, + 60*1000*1000); + clk_register_clkdev(clk, "utmipll_60M", NULL); + clks[TEGRA210_CLK_UTMIPLL_60M] =3D clk; + } + + /* PLLU_OUT1 */ + clk =3D tegra_clk_register_divider("pll_u_out1_div", "pll_u_out", + clk_base + PLLU_OUTA, 0, + TEGRA_DIVIDER_ROUND_UP, + 8, 8, 1, &pll_u_lock); + clk =3D tegra_clk_register_pll_out("pll_u_out1", "pll_u_out1_div", + clk_base + PLLU_OUTA, 1, 0, + CLK_SET_RATE_PARENT, 0, &pll_u_lock); + clk_register_clkdev(clk, "pll_u_out1", NULL); + clks[TEGRA210_CLK_PLL_U_OUT1] =3D clk; + + /* PLLU_OUT2 */ + clk =3D tegra_clk_register_divider("pll_u_out2_div", "pll_u_out", + clk_base + PLLU_OUTA, 0, + TEGRA_DIVIDER_ROUND_UP, + 24, 8, 1, &pll_u_lock); + clk =3D tegra_clk_register_pll_out("pll_u_out2", "pll_u_out2_div", + clk_base + PLLU_OUTA, 17, 16, + CLK_SET_RATE_PARENT, 0, &pll_u_lock); + clk_register_clkdev(clk, "pll_u_out2", NULL); + clks[TEGRA210_CLK_PLL_U_OUT2] =3D clk; + + /* PLLU_480M */ + clk =3D clk_register_gate(NULL, "pll_u_480M", "pll_u_vco", + CLK_SET_RATE_PARENT, clk_base + PLLU_BASE, + 22, 0, &pll_u_lock); + clk_register_clkdev(clk, "pll_u_480M", NULL); + clks[TEGRA210_CLK_PLL_U_480M] =3D clk; + + /* PLLU_60M */ + clk =3D clk_register_gate(NULL, "pll_u_60M", "pll_u_out2", + CLK_SET_RATE_PARENT, clk_base + PLLU_BASE, + 23, 0, &pll_u_lock); + clk_register_clkdev(clk, "pll_u_60M", NULL); + clks[TEGRA210_CLK_PLL_U_60M] =3D clk; + + /* PLLU_48M */ + clk =3D clk_register_gate(NULL, "pll_u_48M", "pll_u_out1", + CLK_SET_RATE_PARENT, clk_base + PLLU_BASE, + 25, 0, &pll_u_lock); + clk_register_clkdev(clk, "pll_u_48M", NULL); + clks[TEGRA210_CLK_PLL_U_48M] =3D clk; + + /* PLLD */ + clk =3D tegra_clk_register_pll("pll_d", "pll_ref", clk_base, pmc, 0, + &pll_d_params, &pll_d_lock); + clk_register_clkdev(clk, "pll_d", NULL); + clks[TEGRA210_CLK_PLL_D] =3D clk; + + /* PLLD_OUT0 */ + clk =3D clk_register_fixed_factor(NULL, "pll_d_out0", "pll_d", + CLK_SET_RATE_PARENT, 1, 2); + clk_register_clkdev(clk, "pll_d_out0", NULL); + clks[TEGRA210_CLK_PLL_D_OUT0] =3D clk; + + /* PLLRE */ + if (pll_re_use_utmipll) { + clk =3D tegra_clk_register_pllre_tegra210( + "pll_re_vco", "utmipll_60M", clk_base, pmc, 0, + &pll_re_vco_params, &pll_re_lock, 60*1000*1000); + } else { + clk =3D tegra_clk_register_pllre_tegra210( + "pll_re_vco", "pll_ref", clk_base, pmc, 0, + &pll_re_vco_params, &pll_re_lock, pll_ref_freq); + } + clk_register_clkdev(clk, "pll_re_vco", NULL); + clks[TEGRA210_CLK_PLL_RE_VCO] =3D clk; + + clk =3D clk_register_divider_table(NULL, "pll_re_out", "pll_re_vco", 0, + clk_base + PLLRE_BASE, 16, 5, 0, + pll_vco_post_div_table, &pll_re_lock); + clk_register_clkdev(clk, "pll_re_out", NULL); + clks[TEGRA210_CLK_PLL_RE_OUT] =3D clk; + + clk =3D tegra_clk_register_divider("pll_re_out1_div", "pll_re_vco", + clk_base + PLLRE_OUT1, 0, + TEGRA_DIVIDER_ROUND_UP, + 8, 8, 1, NULL); + clk =3D tegra_clk_register_pll_out("pll_re_out1", "pll_re_out1_div", + clk_base + PLLRE_OUT1, 1, 0, + CLK_SET_RATE_PARENT, 0, NULL); + clks[TEGRA210_CLK_PLL_RE_OUT1] =3D clk; + + /* PLLE */ + clk =3D tegra_clk_register_plle_tegra210("pll_e", "pll_ref", + clk_base, 0, &pll_e_params, &pll_e_lock); + clk_register_clkdev(clk, "pll_e", NULL); + clks[TEGRA210_CLK_PLL_E] =3D clk; + + /* PLLC4 */ + clk =3D tegra_clk_register_pllre_tegra210("pll_c4_vco", "pll_ref", + clk_base, pmc, 0, &pll_c4_vco_params, NULL, pll_ref_freq); + clk_register_clkdev(clk, "pll_c4_vco", NULL); + clks[TEGRA210_CLK_PLL_C4] =3D clk; + + /* PLLC4_OUT1 */ + clk =3D clk_register_fixed_factor(NULL, "pll_c4_out1", "pll_c4_vco", + CLK_SET_RATE_PARENT, 1, 3); + clk_register_clkdev(clk, "pll_c4_out1", NULL); + clks[TEGRA210_CLK_PLL_C4_OUT1] =3D clk; + + /* PLLC4_OUT2 */ + clk =3D clk_register_fixed_factor(NULL, "pll_c4_out2", "pll_c4_vco", + CLK_SET_RATE_PARENT, 1, 5); + clk_register_clkdev(clk, "pll_c4_out2", NULL); + clks[TEGRA210_CLK_PLL_C4_OUT2] =3D clk; + + /* PLLC4_OUT3 */ + clk =3D tegra_clk_register_divider("pll_c4_out3_div", "pll_c4_out0", + clk_base + PLLC4_OUT, 0, TEGRA_DIVIDER_ROUND_UP, + 8, 8, 1, NULL); + clk =3D tegra_clk_register_pll_out("pll_c4_out3", "pll_c4_out3_div", + clk_base + PLLC4_OUT, 1, 0, + CLK_SET_RATE_PARENT, 0, NULL); + clk_register_clkdev(clk, "pll_c4_out3", NULL); + clks[TEGRA210_CLK_PLL_C4_OUT3] =3D clk; + + /* PLLDP */ + clk =3D tegra_clk_register_pllss_tegra210("pll_dp", "pll_ref", clk_base, + 0, &pll_dp_params, NULL); + clk_register_clkdev(clk, "pll_dp", NULL); + clks[TEGRA210_CLK_PLL_DP] =3D clk; + + /* PLLD2 */ + clk =3D tegra_clk_register_pllss_tegra210("pll_d2", "pll_ref", clk_base, + 0, &pll_d2_params, NULL); + clk_register_clkdev(clk, "pll_d2", NULL); + clks[TEGRA210_CLK_PLL_D2] =3D clk; + + /* PLLD2_OUT0 */ + clk =3D clk_register_fixed_factor(NULL, "pll_d2_out0", "pll_d2", + CLK_SET_RATE_PARENT, 1, 1); + clk_register_clkdev(clk, "pll_d2_out0", NULL); + clks[TEGRA210_CLK_PLL_D2_OUT0] =3D clk; + + /* PLLP_OUT2 */ + clk =3D clk_register_fixed_factor(NULL, "pll_p_out2", "pll_p", + CLK_SET_RATE_PARENT, 1, 2); + clk_register_clkdev(clk, "pll_p_out2", NULL); + clks[TEGRA210_CLK_PLL_P_OUT2] =3D clk; + + /* PLLP_UD */ + clk =3D clk_register_fixed_factor(NULL, "pll_p_ud", "pll_p", + CLK_SET_RATE_PARENT, 1, 1); + clk_register_clkdev(clk, "pll_pud", NULL); + clks[TEGRA210_CLK_PLL_P_UD] =3D clk; + + /* PLLP_UPHY_OUT */ + clk =3D tegra_clk_register_divider("pll_p_uphy_div", "pll_p_out_xusb", + clk_base + PEX_SATA_USB_RX_BYP, 0, + TEGRA_DIVIDER_ROUND_UP, 0, 8, 1, &pll_p_uphy_lock); + clk =3D clk_register_gate(NULL, "pll_p_uphy_out", "pll_p_uphy_div", + CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, + clk_base + PEX_SATA_USB_RX_BYP, 8, 0, &pll_p_uphy_lock); + clk_register_clkdev(clk, "pll_p_uphy_out", NULL); + clks[TEGRA210_CLK_PLL_P_UPHY_OUT] =3D clk; +} + +/* Tegra210 CPU clock and reset control functions */ +static void tegra210_wait_cpu_in_reset(u32 cpu) +{ + unsigned int reg; + + do { + reg =3D readl(clk_base + CLK_RST_CONTROLLER_CPU_CMPLX_STATUS); + cpu_relax(); + } while (!(reg & (1 << cpu))); /* check CPU been reset or not */ +} + +static void tegra210_disable_cpu_clock(u32 cpu) +{ + /* flow controller would take care in the power sequence. */ +} + +#ifdef CONFIG_PM_SLEEP +#define car_readl(_base, _off) readl_relaxed(clk_base + (_base) + ((_off) = * 4)) +#define car_writel(_val, _base, _off) \ + writel_relaxed(_val, clk_base + (_base) + ((_off) * 4)) + +static u32 spare_reg_ctx, misc_clk_enb_ctx, clk_msk_arm_ctx; +static u32 cpu_softrst_ctx[3]; + +static int tegra210_clk_suspend(void) +{ + unsigned int i; + + clk_save_context(); + + /* + * Save the bootloader configured clock registers SPARE_REG0, + * MISC_CLK_ENB, CLK_MASK_ARM, CPU_SOFTRST_CTRL. + */ + spare_reg_ctx =3D readl_relaxed(clk_base + SPARE_REG0); + misc_clk_enb_ctx =3D readl_relaxed(clk_base + MISC_CLK_ENB); + clk_msk_arm_ctx =3D readl_relaxed(clk_base + CLK_MASK_ARM); + + for (i =3D 0; i < ARRAY_SIZE(cpu_softrst_ctx); i++) + cpu_softrst_ctx[i] =3D car_readl(CPU_SOFTRST_CTRL, i); + + tegra_clk_periph_suspend(); + return 0; +} + +static void tegra210_clk_resume(void) +{ + unsigned int i; + + tegra_clk_osc_resume(clk_base); + + /* + * Restore the bootloader configured clock registers SPARE_REG0, + * MISC_CLK_ENB, CLK_MASK_ARM, CPU_SOFTRST_CTRL from saved context. + */ + writel_relaxed(spare_reg_ctx, clk_base + SPARE_REG0); + writel_relaxed(misc_clk_enb_ctx, clk_base + MISC_CLK_ENB); + writel_relaxed(clk_msk_arm_ctx, clk_base + CLK_MASK_ARM); + + for (i =3D 0; i < ARRAY_SIZE(cpu_softrst_ctx); i++) + car_writel(cpu_softrst_ctx[i], CPU_SOFTRST_CTRL, i); + + /* + * Tegra clock programming sequence recommends peripheral clock to + * be enabled prior to changing its clock source and divider to + * prevent glitchless frequency switch. + * So, enable all peripheral clocks before restoring their source + * and dividers. + */ + writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_L, clk_base + CLK_OUT_ENB_L); + writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_H, clk_base + CLK_OUT_ENB_H); + writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_U, clk_base + CLK_OUT_ENB_U); + writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_V, clk_base + CLK_OUT_ENB_V); + writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_W, clk_base + CLK_OUT_ENB_W); + writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_X, clk_base + CLK_OUT_ENB_X); + writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_Y, clk_base + CLK_OUT_ENB_Y); + + /* wait for all writes to happen to have all the clocks enabled */ + fence_udelay(2, clk_base); + + /* restore PLLs and all peripheral clock rates */ + tegra210_init_pllu(); + clk_restore_context(); + + /* restore saved context of peripheral clocks and reset state */ + tegra_clk_periph_resume(); +} + +static void tegra210_cpu_clock_suspend(void) +{ + /* switch coresite to clk_m, save off original source */ + tegra210_cpu_clk_sctx.clk_csite_src =3D + readl(clk_base + CLK_SOURCE_CSITE); + writel(3 << 30, clk_base + CLK_SOURCE_CSITE); +} + +static void tegra210_cpu_clock_resume(void) +{ + writel(tegra210_cpu_clk_sctx.clk_csite_src, + clk_base + CLK_SOURCE_CSITE); +} +#endif + +static struct syscore_ops tegra_clk_syscore_ops =3D { +#ifdef CONFIG_PM_SLEEP + .suspend =3D tegra210_clk_suspend, + .resume =3D tegra210_clk_resume, +#endif +}; + +static struct tegra_cpu_car_ops tegra210_cpu_car_ops =3D { + .wait_for_reset =3D tegra210_wait_cpu_in_reset, + .disable_clock =3D tegra210_disable_cpu_clock, +#ifdef CONFIG_PM_SLEEP + .suspend =3D tegra210_cpu_clock_suspend, + .resume =3D tegra210_cpu_clock_resume, +#endif +}; + +static const struct of_device_id pmc_match[] __initconst =3D { + { .compatible =3D "nvidia,tegra210b01-pmc" }, + { }, +}; + +static struct tegra_clk_init_table t210b01_init_table[] __initdata =3D { + { TEGRA210_CLK_PLL_A, TEGRA210_CLK_CLK_MAX, 564480000, 1, + TEGRA_TABLE_RATE_CHANGE_OVERCLOCK }, + { TEGRA210_CLK_PLL_RE_VCO, TEGRA210_CLK_CLK_MAX, 0, 1, + TEGRA_TABLE_RATE_CHANGE_OVERCLOCK }, + { TEGRA210_CLK_PLL_DP, TEGRA210_CLK_CLK_MAX, 270000000, 0, + TEGRA_TABLE_RATE_CHANGE_OVERCLOCK }, + { TEGRA210_CLK_PLL_P_UPHY_OUT, TEGRA210_CLK_CLK_MAX, 102000000, 1 }, + { TEGRA210_CLK_SDMMC_LEGACY, TEGRA210_CLK_PLL_P, 12000000, 0 }, + { TEGRA210_CLK_I2CSLOW, TEGRA210_CLK_CLK_32K, 32000, 0 }, + { TEGRA210_CLK_SPDIF_IN, TEGRA210_CLK_CLK_MAX, 136000000, 0 }, + { TEGRA210_CLK_USB2_HSIC_TRK, TEGRA210_CLK_CLK_MAX, 9600000, 0 }, + /* This MUST be the last entry. */ + { TEGRA210_CLK_CLK_MAX, TEGRA210_CLK_CLK_MAX, 0, 0 }, +}; + +static struct tegra_clk_init_table init_table[] __initdata =3D { + { TEGRA210_CLK_UARTA, TEGRA210_CLK_PLL_P, 408000000, 0 }, + { TEGRA210_CLK_UARTB, TEGRA210_CLK_PLL_P, 408000000, 0 }, + { TEGRA210_CLK_UARTC, TEGRA210_CLK_PLL_P, 408000000, 0 }, + { TEGRA210_CLK_UARTD, TEGRA210_CLK_PLL_P, 408000000, 0 }, + { TEGRA210_CLK_PLL_A_OUT0, TEGRA210_CLK_CLK_MAX, 11289600, 0 }, + { TEGRA210_CLK_I2S0, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 }, + { TEGRA210_CLK_I2S1, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 }, + { TEGRA210_CLK_I2S2, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 }, + { TEGRA210_CLK_I2S3, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 }, + { TEGRA210_CLK_I2S4, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 }, + { TEGRA210_CLK_HOST1X, TEGRA210_CLK_PLL_P, 136000000, 1 }, + { TEGRA210_CLK_SCLK_MUX, TEGRA210_CLK_PLL_P, 0, 1 }, + { TEGRA210_CLK_SCLK, TEGRA210_CLK_CLK_MAX, 102000000, 0 }, + { TEGRA210_CLK_DFLL_SOC, TEGRA210_CLK_PLL_P, 51000000, 1 }, + { TEGRA210_CLK_DFLL_REF, TEGRA210_CLK_PLL_P, 51000000, 1 }, + { TEGRA210_CLK_SBC4, TEGRA210_CLK_PLL_P, 12000000, 1 }, + { TEGRA210_CLK_PLL_U_OUT1, TEGRA210_CLK_CLK_MAX, 48000000, 1 }, + { TEGRA210_CLK_XUSB_GATE, TEGRA210_CLK_CLK_MAX, 0, 1 }, + { TEGRA210_CLK_XUSB_SS_SRC, TEGRA210_CLK_PLL_U_480M, 120000000, 0 }, + { TEGRA210_CLK_XUSB_FS_SRC, TEGRA210_CLK_PLL_U_48M, 48000000, 0 }, + { TEGRA210_CLK_XUSB_HS_SRC, TEGRA210_CLK_XUSB_SS_SRC, 120000000, 0 }, + { TEGRA210_CLK_XUSB_SSP_SRC, TEGRA210_CLK_XUSB_SS_SRC, 120000000, 0 }, + { TEGRA210_CLK_XUSB_FALCON_SRC, TEGRA210_CLK_PLL_P_OUT_XUSB, 204000000, 0= }, + { TEGRA210_CLK_XUSB_HOST_SRC, TEGRA210_CLK_PLL_P_OUT_XUSB, 102000000, 0 }, + { TEGRA210_CLK_XUSB_DEV_SRC, TEGRA210_CLK_PLL_P_OUT_XUSB, 102000000, 0 }, + { TEGRA210_CLK_SATA, TEGRA210_CLK_PLL_P, 104000000, 0 }, + { TEGRA210_CLK_SATA_OOB, TEGRA210_CLK_PLL_P, 204000000, 0 }, + { TEGRA210_CLK_MSELECT, TEGRA210_CLK_CLK_MAX, 0, 1 }, + { TEGRA210_CLK_CSITE, TEGRA210_CLK_CLK_MAX, 0, 1 }, + /* TODO find a way to enable this on-demand */ + { TEGRA210_CLK_DBGAPB, TEGRA210_CLK_CLK_MAX, 0, 1 }, + { TEGRA210_CLK_TSENSOR, TEGRA210_CLK_CLK_M, 400000, 0 }, + { TEGRA210_CLK_I2C1, TEGRA210_CLK_PLL_P, 0, 0 }, + { TEGRA210_CLK_I2C2, TEGRA210_CLK_PLL_P, 0, 0 }, + { TEGRA210_CLK_I2C3, TEGRA210_CLK_PLL_P, 0, 0 }, + { TEGRA210_CLK_I2C4, TEGRA210_CLK_PLL_P, 0, 0 }, + { TEGRA210_CLK_I2C5, TEGRA210_CLK_PLL_P, 0, 0 }, + { TEGRA210_CLK_I2C6, TEGRA210_CLK_PLL_P, 0, 0 }, + { TEGRA210_CLK_SOC_THERM, TEGRA210_CLK_PLL_P, 51000000, 0 }, + { TEGRA210_CLK_CCLK_G, TEGRA210_CLK_CLK_MAX, 0, 1 }, + { TEGRA210_CLK_PLL_U_OUT2, TEGRA210_CLK_CLK_MAX, 60000000, 1 }, + { TEGRA210_CLK_SPDIF_IN_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, + { TEGRA210_CLK_I2S0_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, + { TEGRA210_CLK_I2S1_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, + { TEGRA210_CLK_I2S2_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, + { TEGRA210_CLK_I2S3_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, + { TEGRA210_CLK_I2S4_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, + { TEGRA210_CLK_VIMCLK_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, + { TEGRA210_CLK_HDA, TEGRA210_CLK_PLL_P, 51000000, 0 }, + { TEGRA210_CLK_HDA2CODEC_2X, TEGRA210_CLK_PLL_P, 48000000, 0 }, + { TEGRA210_CLK_PWM, TEGRA210_CLK_PLL_P, 48000000, 0 }, + /* This MUST be the last entry. */ + { TEGRA210_CLK_CLK_MAX, TEGRA210_CLK_CLK_MAX, 0, 0 }, +}; + +static void __init tegra210b01_clock_table_init(struct clk **clks) +{ + struct clk *clk; + unsigned long rate; + + /* Set PLL_RE at 625 MHz from UTMIPLL, or 672MHz, otherwise */ + rate =3D (pll_re_use_utmipll ? 625 : 672) * 1000 * 1000; + clk =3D clks[TEGRA210_CLK_PLL_RE_VCO]; + WARN_ON(IS_ERR_OR_NULL(clk)); + if (clk_set_rate(clk, rate)) + WARN(1, "%s: Failed to set rate %lu of %s\n", + __func__, rate, __clk_get_name(clk)); + + tegra_init_from_table(t210b01_init_table, clks, TEGRA210_CLK_CLK_MAX); +} + +/** + * tegra210b01_clock_apply_init_table - initialize clocks on Tegra210 SoCs + * + * Program an initial clock rate and enable or disable clocks needed + * by the rest of the kernel, for Tegra210 SoCs. It is intended to be + * called by assigning a pointer to it to tegra_clk_apply_init_table - + * this will be called as an arch_initcall. No return value. + */ +static void __init tegra210b01_clock_apply_init_table(void) +{ + tegra210b01_clock_table_init(clks); + tegra_init_from_table(init_table, clks, TEGRA210_CLK_CLK_MAX); +} + +/** + * tegra210b01_car_barrier - wait for pending writes to the CAR to complete + * + * Wait for any outstanding writes to the CAR MMIO space from this CPU + * to complete before continuing execution. No return value. + */ +static void tegra210b01_car_barrier(void) +{ + readl_relaxed(clk_base + RST_DFLL_DVCO); +} + +/** + * tegra210b01_clock_assert_dfll_dvco_reset - assert the DFLL's DVCO reset + * + * Assert the reset line of the DFLL's DVCO. No return value. + */ +static void tegra210b01_clock_assert_dfll_dvco_reset(void) +{ + u32 v; + + v =3D readl_relaxed(clk_base + RST_DFLL_DVCO); + v |=3D (1 << DVFS_DFLL_RESET_SHIFT); + writel_relaxed(v, clk_base + RST_DFLL_DVCO); + tegra210b01_car_barrier(); +} + +/** + * tegra210b01_clock_deassert_dfll_dvco_reset - deassert the DFLL's DVCO r= eset + * + * Deassert the reset line of the DFLL's DVCO, allowing the DVCO to + * operate. No return value. + */ +static void tegra210b01_clock_deassert_dfll_dvco_reset(void) +{ + u32 v; + + v =3D readl_relaxed(clk_base + RST_DFLL_DVCO); + v &=3D ~(1 << DVFS_DFLL_RESET_SHIFT); + writel_relaxed(v, clk_base + RST_DFLL_DVCO); + tegra210b01_car_barrier(); +} + +static int tegra210b01_reset_assert(unsigned long id) +{ + if (id =3D=3D TEGRA210_RST_DFLL_DVCO) + tegra210b01_clock_assert_dfll_dvco_reset(); + else if (id =3D=3D TEGRA210_RST_ADSP) + writel(GENMASK(26, 21) | BIT(7), + clk_base + CLK_RST_CONTROLLER_RST_DEV_Y_SET); + else + return -EINVAL; + + return 0; +} + +static int tegra210b01_reset_deassert(unsigned long id) +{ + if (id =3D=3D TEGRA210_RST_DFLL_DVCO) + tegra210b01_clock_deassert_dfll_dvco_reset(); + else if (id =3D=3D TEGRA210_RST_ADSP) { + writel(BIT(21), clk_base + CLK_RST_CONTROLLER_RST_DEV_Y_CLR); + /* + * Considering adsp cpu clock (min: 12.5MHZ, max: 1GHz) + * a delay of 5us ensures that it's at least + * 6 * adsp_cpu_cycle_period long. + */ + udelay(5); + writel(GENMASK(26, 22) | BIT(7), + clk_base + CLK_RST_CONTROLLER_RST_DEV_Y_CLR); + } else + return -EINVAL; + + return 0; +} + +static enum clk_id tegra210b01_integer_div_id[] =3D { + tegra_clk_cilab, + tegra_clk_cilcd, + + tegra_clk_spdif_out, + + tegra_clk_sbc1_9, + tegra_clk_sbc2_9, + tegra_clk_sbc3_9, + tegra_clk_sbc4_9, + + tegra_clk_sdmmc_legacy, + tegra_clk_i2cslow, + tegra_clk_qspi, + + tegra_clk_soc_therm_8, + tegra_clk_tsensor, +}; + +static void tegra210b01_adjust_clks(struct tegra_clk *tegra_clks) +{ + int i; + + /* Remove CPU_LP claster clocks */ + tegra_clks[tegra_clk_cclk_lp].present =3D false; + tegra_clks[tegra_clk_pll_x_out0].present =3D false; + + /* Prevent 1:1.5 fractional divider setting */ + div1_5_not_allowed =3D true; + + /* Prevent any fractional setting */ + for (i =3D 0; i < ARRAY_SIZE(tegra210b01_integer_div_id); i++) { + enum clk_id cid =3D tegra210b01_integer_div_id[i]; + + if (cid >=3D tegra_clk_max || !tegra_clks[cid].present) { + pr_warn("%s: clk %d is not present\n", __func__, cid); + continue; + } + tegra_clks[cid].use_integer_div =3D true; + } +} + +static void tegra210b01_mbist_clk_init(void) +{ + unsigned int i, j; + + for (i =3D 0; i < ARRAY_SIZE(tegra210_pg_mbist_war); i++) { + unsigned int num_clks =3D tegra210_pg_mbist_war[i].num_clks; + struct clk_bulk_data *clk_data; + + if (!num_clks) + continue; + + clk_data =3D kmalloc_array(num_clks, sizeof(*clk_data), + GFP_KERNEL); + if (WARN_ON(!clk_data)) + return; + + tegra210_pg_mbist_war[i].clks =3D clk_data; + for (j =3D 0; j < num_clks; j++) { + int clk_id =3D tegra210_pg_mbist_war[i].clk_init_data[j]; + struct clk *clk =3D clks[clk_id]; + + if (WARN(IS_ERR(clk), "clk_id: %d\n", clk_id)) { + kfree(clk_data); + tegra210_pg_mbist_war[i].clks =3D NULL; + break; + } + clk_data[j].clk =3D clk; + } + } +} + +/** + * tegra210b01_clock_init - Tegra210-specific clock initialization + * @np: struct device_node * of the DT node for the SoC CAR IP block + * + * Register most SoC clocks for the Tegra210B01 system-on-chip. Intended + * to be called by the OF init code when a DT node with the + * "nvidia,tegra210b01-car" string is encountered, and declared with + * CLK_OF_DECLARE. No return value. + */ +static void __init tegra210b01_clock_init(struct device_node *np) +{ + struct device_node *node; + u32 value, clk_m_div; + + clk_base =3D of_iomap(np, 0); + if (!clk_base) { + pr_err("ioremap tegra210 CAR failed\n"); + return; + } + + node =3D of_find_matching_node(NULL, pmc_match); + if (!node) { + pr_err("Failed to find pmc node\n"); + WARN_ON(1); + return; + } + + pmc_base =3D of_iomap(node, 0); + of_node_put(node); + if (!pmc_base) { + pr_err("Can't map pmc registers\n"); + WARN_ON(1); + return; + } + + ahub_base =3D ioremap(TEGRA210_AHUB_BASE, SZ_64K); + if (!ahub_base) { + pr_err("ioremap tegra210 APE failed\n"); + return; + } + + dispa_base =3D ioremap(TEGRA210_DISPA_BASE, SZ_256K); + if (!dispa_base) { + pr_err("ioremap tegra210 DISPA failed\n"); + return; + } + + vic_base =3D ioremap(TEGRA210_VIC_BASE, SZ_256K); + if (!vic_base) { + pr_err("ioremap tegra210 VIC failed\n"); + return; + } + + clks =3D tegra_clk_init(clk_base, TEGRA210_CLK_CLK_MAX, + TEGRA210_CAR_BANK_COUNT); + if (!clks) + return; + + tegra210b01_adjust_clks(tegra210_clks); + + value =3D readl(clk_base + SPARE_REG0) >> CLK_M_DIVISOR_SHIFT; + clk_m_div =3D (value & CLK_M_DIVISOR_MASK) + 1; + + if (tegra_osc_clk_init(clk_base, tegra210_clks, tegra210_input_freq, + ARRAY_SIZE(tegra210_input_freq), clk_m_div, + &osc_freq, &pll_ref_freq) < 0) + return; + + tegra_fixed_clk_init(tegra210_clks); + tegra210_pll_init(clk_base, pmc_base); + tegra210_periph_clk_init(np, clk_base, pmc_base); + tegra_audio_clk_init(clk_base, pmc_base, tegra210_clks, + tegra210_audio_plls, + ARRAY_SIZE(tegra210_audio_plls), 24576000); + + /* For Tegra210, PLLD is the only source for DSIA & DSIB */ + value =3D readl(clk_base + PLLD_BASE); + value &=3D ~BIT(25); + writel(value, clk_base + PLLD_BASE); + + tegra_clk_apply_init_table =3D tegra210b01_clock_apply_init_table; + + tegra_super_clk_gen5_init(clk_base, pmc_base, tegra210_clks, + &pll_x_params); + tegra_init_special_resets(2, tegra210b01_reset_assert, + tegra210b01_reset_deassert); + + tegra_add_of_provider(np, of_clk_src_onecell_get); + tegra_register_devclks(devclks, ARRAY_SIZE(devclks)); + + tegra210b01_mbist_clk_init(); + + tegra_cpu_car_ops =3D &tegra210_cpu_car_ops; + + register_syscore_ops(&tegra_clk_syscore_ops); +} +CLK_OF_DECLARE(tegra210b01, "nvidia,tegra210b01-car", tegra210b01_clock_in= it); diff --git a/drivers/clk/tegra/clk-utils.c b/drivers/clk/tegra/clk-utils.c index 1a5daae4e501489dadbd6c9bbe671693c3407d86..4283f314c513fb23b562a9b5f09= a081f7e9199e4 100644 --- a/drivers/clk/tegra/clk-utils.c +++ b/drivers/clk/tegra/clk-utils.c @@ -31,7 +31,7 @@ int div_frac_get(unsigned long rate, unsigned parent_rate= , u8 width, if (flags & TEGRA_DIVIDER_INT) divider_ux1 *=3D mul; =20 - if (divider_ux1 < mul) + if (!div1_5_not_allowed && divider_ux1 < mul) return 0; =20 divider_ux1 -=3D mul; @@ -39,5 +39,8 @@ int div_frac_get(unsigned long rate, unsigned parent_rate= , u8 width, if (divider_ux1 > div_mask(width)) return div_mask(width); =20 + if (div1_5_not_allowed && (divider_ux1 > 0) && (divider_ux1 < mul)) + divider_ux1 =3D (flags & TEGRA_DIVIDER_ROUND_UP) ? mul : 0; + return divider_ux1; } diff --git a/drivers/clk/tegra/clk.c b/drivers/clk/tegra/clk.c index 19037346f5225057c5537f4cc9f38e6bc442eb09..c185a7453b387c1fd39ba7ccd17= c21afeb082d40 100644 --- a/drivers/clk/tegra/clk.c +++ b/drivers/clk/tegra/clk.c @@ -26,6 +26,7 @@ static struct tegra_cpu_car_ops dummy_car_ops; struct tegra_cpu_car_ops *tegra_cpu_car_ops =3D &dummy_car_ops; =20 int *periph_clk_enb_refcnt; +bool div1_5_not_allowed; static int periph_banks; static u32 *periph_state_ctx; static struct clk **clks; @@ -291,13 +292,27 @@ void tegra_init_from_table(struct tegra_clk_init_tabl= e *tbl, } } =20 - if (tbl->rate) - if (clk_set_rate(clk, tbl->rate)) { + if (tbl->rate) { + bool can_set_rate =3D true; + + if ((tbl->flags & TEGRA_TABLE_RATE_CHANGE_OVERCLOCK) && + __clk_is_enabled(clk)) { + if (tbl->rate !=3D clk_get_rate(clk)) { + pr_err("%s: Can't set rate %lu of %s\n", + __func__, tbl->rate, + __clk_get_name(clk)); + WARN_ON(1); + } + can_set_rate =3D false; + } + + if (can_set_rate && clk_set_rate(clk, tbl->rate)) { pr_err("%s: Failed to set rate %lu of %s\n", __func__, tbl->rate, __clk_get_name(clk)); WARN_ON(1); } + } =20 if (tbl->state) if (clk_prepare_enable(clk)) { diff --git a/drivers/clk/tegra/clk.h b/drivers/clk/tegra/clk.h index 5d80d8b79b8e0571a73badcde82781e6655fe7e6..a2a1a3581a9490bfaccef879434= e36f8c4fa6061 100644 --- a/drivers/clk/tegra/clk.h +++ b/drivers/clk/tegra/clk.h @@ -87,6 +87,7 @@ struct tegra_clk_sync_source { =20 extern const struct clk_ops tegra_clk_sync_source_ops; extern int *periph_clk_enb_refcnt; +extern bool div1_5_not_allowed; =20 struct clk *tegra_clk_register_sync_source(const char *name, unsigned long max_rate); @@ -801,14 +802,18 @@ struct clk *tegra_clk_register_sdmmc_mux_div(const ch= ar *name, * @parent_id: parent clock id as mentioned in device tree bindings * @rate: rate to set * @state: enable/disable + * @flags: clock initialization flags */ struct tegra_clk_init_table { unsigned int clk_id; unsigned int parent_id; unsigned long rate; int state; + u32 flags; }; =20 +#define TEGRA_TABLE_RATE_CHANGE_OVERCLOCK BIT(0) + /** * struct clk_duplicate - duplicate clocks * @clk_id: clock id as mentioned in device tree bindings @@ -831,6 +836,7 @@ struct tegra_clk_duplicate { struct tegra_clk { int dt_id; bool present; + bool use_integer_div; }; =20 struct tegra_devclk { --=20 2.50.1 From nobody Mon Oct 6 13:17:47 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 6BA17211A27; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; cv=none; b=hak2NOpCLsyBarCiz8QXmjdqAn5cYvNf2J10l3aaEaVVbz3rIeG07ANOBxtkmsIQCl5cQMJVJw/wQpqpUVJPoK3dTKJlOtf18MPOLvjSgMbBjcXL6jfGTSRihzetpGcnAkOjGGNkKnc4IFhaj9Ppzq9llm4QRRlhpCz+qnzq3eA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; c=relaxed/simple; bh=HKncAPxSIMFbw/2kZa81BXmIQwYXT5pSJU8eZyb16Cw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Z+MrGtqa5dtMXXqXCbT/GR5B/qg7/4csop+fi7N7efPcOkSDPIFt8YOAdtkqPGM06qEYeIGdy78UjzYdbcIPBijOeoi14HJhC9mj697pmGU6kI+dVbeAy7s+bs92pvrfSpYvIyOCqIOSFbk1Ke4MLxFCImHre8tmTk2CwGf+bUU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=sDF8p2SV; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="sDF8p2SV" Received: by smtp.kernel.org (Postfix) with ESMTPS id 4C4DFC4CEEB; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753064241; bh=HKncAPxSIMFbw/2kZa81BXmIQwYXT5pSJU8eZyb16Cw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=sDF8p2SVWKxAW8J8sVNoycp3TMCvNEy5tH33ogmoNDZGN4d0EPFFba4hOSIc5pKYA PvRMaAac86/chcGIv6ZLiPvUZojhVXBetuzUjjWJbrnegEVtVm0QU9z340HRuqepo5 W9Rso2yyrnDBaM/oyuqmJWrkoflU+nTgSt63zvjVmgqB5VhqYGOy6Hp/QCC/66LJgn uMrywjTTh6IwMgg06aKRsuwSyUXCWozEuJuaTz2CrDMMyvyTR1QLdg8x0Mxm05aI5J ZrfBFjrOAMvEyEwTcPU6P3LzYHQP8B8c7M+qM0nyf1/DwRwbBqnwTOxmPrrXkvq0v2 VoyTRw9K4A/4Q== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4443EC83F17; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) From: Aaron Kling via B4 Relay Date: Sun, 20 Jul 2025 21:15:09 -0500 Subject: [PATCH v2 15/17] arm64: tegra: Add BPMP node for Tegra210 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 Message-Id: <20250720-t210b01-v2-15-9cb209f1edfc@gmail.com> References: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> In-Reply-To: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Vinod Koul , Kishon Vijay Abraham I , Greg Kroah-Hartman , Nagarjuna Kristam , JC Kuo , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Michael Turquette , Stephen Boyd , Mathias Nyman , Peter De Schrijver , Prashant Gaikwad Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, Thierry Reding , linux-pm@vger.kernel.org, linux-clk@vger.kernel.org, Aaron Kling X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753064238; l=1355; i=webgeek1234@gmail.com; s=20250217; h=from:subject:message-id; bh=Hy6C9irOt/10mikaBceHy3GtlZHG/JQi0cSRGeXarHY=; b=EfHg7uCuTKPxSk0yEqtg1tdc8FokfNrH8aTGAsexCfz0kAHF4YypdOpv+MuIC8f81hsYMrDlp IZ/nwyRzRXeDveBxKSISA5ao0hXZ9iMk5PH60qtWJwALZHzNE1O/kwh X-Developer-Key: i=webgeek1234@gmail.com; a=ed25519; pk=TQwd6q26txw7bkK7B8qtI/kcAohZc7bHHGSD7domdrU= X-Endpoint-Received: by B4 Relay for webgeek1234@gmail.com/20250217 with auth_id=342 X-Original-From: Aaron Kling Reply-To: webgeek1234@gmail.com From: Aaron Kling The Tegra210 soc supports bpmp offload for power management among other things. This was considered insecure partway through the soc's lifecycle and support was removed in the bootloader. However, Tegra210B01 returned to using the bpmp. Plus old bootloaders on the original Tegra210 still work with the existing driver. So add the node to the common Tegra210 soc dtsi, but disabled by default. Signed-off-by: Aaron Kling --- arch/arm64/boot/dts/nvidia/tegra210.dtsi | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/arch/arm64/boot/dts/nvidia/tegra210.dtsi b/arch/arm64/boot/dts= /nvidia/tegra210.dtsi index 402b0ede1472af625d9d9e811f5af306d436cc98..3361de1ab41b37e430d399df2bf= 77d64226f33e8 100644 --- a/arch/arm64/boot/dts/nvidia/tegra210.dtsi +++ b/arch/arm64/boot/dts/nvidia/tegra210.dtsi @@ -968,6 +968,17 @@ cec@70015000 { status =3D "disabled"; }; =20 + bpmp: bpmp@70016000 { + compatible =3D "nvidia,tegra210-bpmp"; + reg =3D <0x0 0x70016000 0x0 0x2000 + 0x0 0x60001000 0x0 0x1000>; + status =3D "disabled"; + + interrupts =3D , + ; + interrupt-names =3D "tx", "rx"; + }; + mc: memory-controller@70019000 { compatible =3D "nvidia,tegra210-mc"; reg =3D <0x0 0x70019000 0x0 0x1000>; --=20 2.50.1 From nobody Mon Oct 6 13:17:47 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 804D821A435; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; cv=none; b=aYJupbztAnoas3PPkdR1bKS3kOgdlnhYvI2xARZporKGkYJbPvZbsFbeHkNRRUa+J0m0drFargp+QzDp6AujdjX+ovIzkCG7ABRmpjUUganRj7DA40OTvMvZhEgCmwJ4WwLYUsv7stKfqfd9v1b32EKoT0zWgWdA4V238IfNcw4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; c=relaxed/simple; bh=3ydShq20mxxCIN54bhrZPW1GL4izZ/sL45OAM2AudYs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tWMzN/Ut0W++TvtJeRAzcPh/JL2bKi5ZVSoc2X20haxG9WO5aSCeXusvZUJf/kMA4FKp8oahrV4AjWa2B0rmM75XLa5HWbtknIYqqclwlRnkW3ddHv6yDTFJsqaqQJewUgt9f3MeOcsRjsWKm0zq7kx0TzJ3g8WvNDqCEVlF4mk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nnixVS72; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nnixVS72" Received: by smtp.kernel.org (Postfix) with ESMTPS id 5D3B2C4CEF9; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753064241; bh=3ydShq20mxxCIN54bhrZPW1GL4izZ/sL45OAM2AudYs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=nnixVS72iOnqo/kicb14gXMzfO77Y4HUYG2mx1Yq0bIfXfW35S8rFiANdqqYv7sCW OwQ+O3f7t/l4n22qVpG3ict2MjiwrgWee1OEJHcUAL1RxdzipkpZWRyg7zNHjAt/fs 0W0cH/tzyaaTz3ojPe1dywjg9QSE/3K0zzCp9QFD1BwxZGeGRTuNZwAb/pMn3twdyJ nJn3Tmq8M86VXFQB7Xff5dHOd4CguB455bgfi+crQzZrm97qX+3b38Ls+y9XB00Dz6 +VgvJrYBUwx1/dWXlBO0n3rco89bc7YWPdVJ7/Z+2H82MzyQEDFTm8ari+XRi9YVy0 trGh470NFgDJg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5419EC83F1A; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) From: Aaron Kling via B4 Relay Date: Sun, 20 Jul 2025 21:15:10 -0500 Subject: [PATCH v2 16/17] arm64: tegra: Add Tegra210B01 support 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 Message-Id: <20250720-t210b01-v2-16-9cb209f1edfc@gmail.com> References: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> In-Reply-To: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Vinod Koul , Kishon Vijay Abraham I , Greg Kroah-Hartman , Nagarjuna Kristam , JC Kuo , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Michael Turquette , Stephen Boyd , Mathias Nyman , Peter De Schrijver , Prashant Gaikwad Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, Thierry Reding , linux-pm@vger.kernel.org, linux-clk@vger.kernel.org, Aaron Kling X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753064238; l=1982; i=webgeek1234@gmail.com; s=20250217; h=from:subject:message-id; bh=49OX805LYoy4B3LF8skuT6ywroy9Cv9R181cjDO5IEQ=; b=oMVw8JtuhnOyL5sYPqAD8v+W7FmFHchQmwUYJ7IgbcGTDm7t/8Wop5PETkYVy1RjMNHclfNxh u0XFXiUhd/2CUs0Ipn+o0vaXkzLHwjiABqWIKxODj92Ph3IVLOzfPl/ X-Developer-Key: i=webgeek1234@gmail.com; a=ed25519; pk=TQwd6q26txw7bkK7B8qtI/kcAohZc7bHHGSD7domdrU= X-Endpoint-Received: by B4 Relay for webgeek1234@gmail.com/20250217 with auth_id=342 X-Original-From: Aaron Kling Reply-To: webgeek1234@gmail.com From: Aaron Kling Also known as Tegra X1+, the Tegra210B01 has higher CPU and GPU clocks than the original Tegra210. Add a SoC-level device tree file that describes most of the hardware available on the SoC. This is derived from the Tegra210 dtsi, as they share a lot. Signed-off-by: Aaron Kling --- arch/arm64/boot/dts/nvidia/tegra210b01.dtsi | 64 +++++++++++++++++++++++++= ++++ 1 file changed, 64 insertions(+) diff --git a/arch/arm64/boot/dts/nvidia/tegra210b01.dtsi b/arch/arm64/boot/= dts/nvidia/tegra210b01.dtsi new file mode 100644 index 0000000000000000000000000000000000000000..87e55af3ed2466c5d353dbd8706= 230aef97b90f7 --- /dev/null +++ b/arch/arm64/boot/dts/nvidia/tegra210b01.dtsi @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: GPL-2.0 +#include "tegra210.dtsi" + +/ { + compatible =3D "nvidia,tegra210b01", "nvidia,tegra210"; + + host1x@50000000 { + /delete-node/ sor@54540000; + /delete-node/ dpaux@545c0000; + + dc@54200000 { + nvidia,outputs =3D <&dsia &dsib &sor1>; + }; + + dc@54240000 { + nvidia,outputs =3D <&dsia &dsib &sor1>; + }; + }; + + clock@60006000 { + compatible =3D "nvidia,tegra210b01-car"; + }; + + i2c@7000d100 { + /delete-property/ pinctrl-0; + /delete-property/ pinctrl-1; + /delete-property/ pinctrl-names; + }; + + pmc@7000e400 { + compatible =3D "nvidia,tegra210b01-pmc"; + }; + + bpmp@70016000 { + status =3D "okay"; + }; + + usb@70090000 { + compatible =3D "nvidia,tegra210b01-xusb"; + }; + + padctl@7009f000 { + compatible =3D "nvidia,tegra210b01-xusb-padctl"; + }; + + usb@700d0000 { + compatible =3D "nvidia,tegra210b01-xudc"; + }; + + thermal-sensor@700e2000 { + compatible =3D "nvidia,tegra210b01-soctherm"; + + throttle-cfgs { + heavy { + nvidia,cpu-throt-percent =3D <0>; + nvidia,gpu-throt-level =3D ; + }; + }; + }; + + clock@70110000 { + compatible =3D "nvidia,tegra210b01-dfll"; + }; +}; --=20 2.50.1 From nobody Mon Oct 6 13:17:47 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 8FAFA21CA07; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; cv=none; b=tNdMlOwgDk0NIor7FKJy1VNdFPF80yOrJ54HUZ+fgOV8E3foxUIxY8YSDLYcHph1fQmbmoBSDtQyNrL72x+wAgJ0JGYfn4CyOBl9TyYT1lEvHxKSiQYJI+tG9/4JM/reWYo0kesakb8qhQTN/p10mJEFMFxyS7/FbqHxf4rDdiM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753064241; c=relaxed/simple; bh=0Sl9ne1fNA79gjabf0syuWDSWv557+WLdkh+UrDoEwc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MPgibWhm149JN//NVJgCs9ahKfzCQx4FqlCQNV5Q95CvF3RWy+iaurUp+srWoKWu/wZwGfNLBoyY4u5RhAFdGAPwOpa96+e2FWlG7/pHafCsRkDlgD84uQoPFQjA+tXDw4h1dMhh5EW27V/NX1Jngjwu8BsATTtXYL64jos+/Nc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=iEBvMVGd; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="iEBvMVGd" Received: by smtp.kernel.org (Postfix) with ESMTPS id 6C964C4CEFC; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753064241; bh=0Sl9ne1fNA79gjabf0syuWDSWv557+WLdkh+UrDoEwc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=iEBvMVGdnmrpx3Gorr8MU9SBlunmSv+vZj9fsDtcAeC0Bw8XXdxqiWxZi08LSbRGY az9vNgK8NarxoRl4Y3E5RC2OVQLMk+EW+/r6rt0V+THT1g6wBilMDqsW8d4TmDutnN TO93MYMT+HfrgiWF7uRpa63xTFr8tuLi8NMxk83lulxzatf0uDssNsTuCDZ18J+d4G 5PX6VEKR3jvkVXYmB5j+7Ur/QjxyQgVxVwEWlC9O3gfSc+ohJDGJEhCoMmKG7S3gjG p16IamcvwtNCoTrauC6wtIDbN0J/2TP5KHwZNZ9ntpeDNQhjL5AMXTYMoaZ1VPKUN8 SpafUfr2VGuQw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 63029C87FC6; Mon, 21 Jul 2025 02:17:21 +0000 (UTC) From: Aaron Kling via B4 Relay Date: Sun, 20 Jul 2025 21:15:11 -0500 Subject: [PATCH v2 17/17] arm64: tegra: Add support for NVIDIA Shield TV Pro 2019 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 Message-Id: <20250720-t210b01-v2-17-9cb209f1edfc@gmail.com> References: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> In-Reply-To: <20250720-t210b01-v2-0-9cb209f1edfc@gmail.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Vinod Koul , Kishon Vijay Abraham I , Greg Kroah-Hartman , Nagarjuna Kristam , JC Kuo , "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Michael Turquette , Stephen Boyd , Mathias Nyman , Peter De Schrijver , Prashant Gaikwad Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, Thierry Reding , linux-pm@vger.kernel.org, linux-clk@vger.kernel.org, Aaron Kling X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753064238; l=3522; i=webgeek1234@gmail.com; s=20250217; h=from:subject:message-id; bh=lBbPA4YnfIve2RzYnMMZrMuioshaXo0K/YzU1CSGgG0=; b=uZ18x9hPOETwB5r3x1VYui41gkdHxgunkMehPDkapwffmjyk9Z9GL845wi0QzejmISzNQ7Qte Wh8pVLrwHUIC3gw1diFucLnJPehp2XDs65AuWnzCj/LV+jaGFCmrF1V X-Developer-Key: i=webgeek1234@gmail.com; a=ed25519; pk=TQwd6q26txw7bkK7B8qtI/kcAohZc7bHHGSD7domdrU= X-Endpoint-Received: by B4 Relay for webgeek1234@gmail.com/20250217 with auth_id=342 X-Original-From: Aaron Kling Reply-To: webgeek1234@gmail.com From: Aaron Kling Add initial device-tree support for NVIDIA Shield TV Pro 2019 (a.k.a MDarcy) based up the Tegra210B01 SoC with 3 GiB of LPDDR4 RAM. This is very basic, intended for checking initial Tegra210B01 support. More complete support for the device will be added later. Signed-off-by: Aaron Kling --- arch/arm64/boot/dts/nvidia/Makefile | 1 + .../boot/dts/nvidia/tegra210b01-p2894-0050-a08.dts | 10 ++++ arch/arm64/boot/dts/nvidia/tegra210b01-p2894.dtsi | 70 ++++++++++++++++++= ++++ 3 files changed, 81 insertions(+) diff --git a/arch/arm64/boot/dts/nvidia/Makefile b/arch/arm64/boot/dts/nvid= ia/Makefile index 0fbb8a494dba5089d9b7243e766bd6028b7f3744..bc6f3e268020b6fdbc90b2fb2ec= 1daf30c80af0e 100644 --- a/arch/arm64/boot/dts/nvidia/Makefile +++ b/arch/arm64/boot/dts/nvidia/Makefile @@ -20,6 +20,7 @@ dtb-$(CONFIG_ARCH_TEGRA_210_SOC) +=3D tegra210-p2571.dtb dtb-$(CONFIG_ARCH_TEGRA_210_SOC) +=3D tegra210-p3450-0000.dtb dtb-$(CONFIG_ARCH_TEGRA_210_SOC) +=3D tegra210-smaug.dtb dtb-$(CONFIG_ARCH_TEGRA_210_SOC) +=3D tegra210-p2894-0050-a08.dtb +dtb-$(CONFIG_ARCH_TEGRA_210_SOC) +=3D tegra210b01-p2894-0050-a08.dtb dtb-$(CONFIG_ARCH_TEGRA_186_SOC) +=3D tegra186-p2771-0000.dtb dtb-$(CONFIG_ARCH_TEGRA_186_SOC) +=3D tegra186-p3509-0000+p3636-0001.dtb dtb-$(CONFIG_ARCH_TEGRA_194_SOC) +=3D tegra194-p2972-0000.dtb diff --git a/arch/arm64/boot/dts/nvidia/tegra210b01-p2894-0050-a08.dts b/ar= ch/arm64/boot/dts/nvidia/tegra210b01-p2894-0050-a08.dts new file mode 100644 index 0000000000000000000000000000000000000000..f18266b3d8ae341feaef5a1a911= 752f6a5ce2d0f --- /dev/null +++ b/arch/arm64/boot/dts/nvidia/tegra210b01-p2894-0050-a08.dts @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0 +/dts-v1/; + +#include "tegra210b01-p2894.dtsi" + +/ { + model =3D "NVIDIA Shield TV Pro 2019"; + compatible =3D "nvidia,p2894-0050-a08", "nvidia,darcy", "nvidia,tegra210b= 01", + "nvidia,tegra210"; +}; diff --git a/arch/arm64/boot/dts/nvidia/tegra210b01-p2894.dtsi b/arch/arm64= /boot/dts/nvidia/tegra210b01-p2894.dtsi new file mode 100644 index 0000000000000000000000000000000000000000..97c9bd8f293539e76d57b6cfee4= 9c60fb482d6ab --- /dev/null +++ b/arch/arm64/boot/dts/nvidia/tegra210b01-p2894.dtsi @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: GPL-2.0 +#include "tegra210b01.dtsi" + +/ { + aliases { + serial0 =3D &uarta; + }; + + chosen { + stdout-path =3D "serial0:115200n8"; + }; + + memory@80000000 { + device_type =3D "memory"; + reg =3D <0x0 0x80000000 0x0 0xc0000000>; + }; + + serial@70006000 { + /delete-property/ dmas; + /delete-property/ dma-names; + status =3D "okay"; + }; + + pmc@7000e400 { + nvidia,invert-interrupt; + nvidia,suspend-mode =3D <0>; + nvidia,cpu-pwr-good-time =3D <0>; + nvidia,cpu-pwr-off-time =3D <0>; + nvidia,core-pwr-good-time =3D <4587 3876>; + nvidia,core-pwr-off-time =3D <39065>; + nvidia,core-power-req-active-high; + nvidia,sys-clock-req-active-high; + status =3D "okay"; + }; + + mmc@700b0600 { + bus-width =3D <8>; + non-removable; + status =3D "okay"; + }; + + clk32k_in: clock-32k { + compatible =3D "fixed-clock"; + clock-frequency =3D <32768>; + #clock-cells =3D <0>; + }; + + cpus { + cpu@0 { + enable-method =3D "psci"; + }; + + cpu@1 { + enable-method =3D "psci"; + }; + + cpu@2 { + enable-method =3D "psci"; + }; + + cpu@3 { + enable-method =3D "psci"; + }; + }; + + psci { + compatible =3D "arm,psci-1.0"; + method =3D "smc"; + }; +}; --=20 2.50.1