From nobody Sun Dec 14 11:14:01 2025 Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 56A5D30DD2E for ; Fri, 14 Nov 2025 14:17:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763129825; cv=none; b=rdw5y3pBqMHGJusQ3QwE4uzWQdMRY/HCNnSo2AoqlorLNFGSrTgOajqh+g4q9BVbWXcZrGWrN+1j+GyV8GVZTlBXn3T9UAk4RTiKJIZ9iBj4KIqssP1RT/oC8XsOJMEGc1eY/gFHPqsN9f7dhm3ulVETErmB+IbUQrIrqePai8M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763129825; c=relaxed/simple; bh=6sKEmCOQ2W5VcemaPNloFrkmil66ilCQ7HCGLcFo2/k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EolT8GwvlEdFg9jynK2DoPfatB+vNNyMK2KimKAiram8+dKfn5eAGOf88DoALFwnLDrUQDW0c2nBMbAgHbhDR2Ch0ZCQreiVROhY5CsvBnMX1G66iH9k+26TZjcVxcbX3RZWOJzzqZRj+eq9ffak2qTfug9umeo7OHcPKVZHlXs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=v9O0Z889; arc=none smtp.client-ip=209.85.221.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="v9O0Z889" Received: by mail-wr1-f43.google.com with SMTP id ffacd0b85a97d-42b427cda88so1492866f8f.0 for ; Fri, 14 Nov 2025 06:17:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1763129822; x=1763734622; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=4oAM1SJwe5be5jeswFgKKg+ScqRvx3vPVGMPIZFDZGA=; b=v9O0Z889gVLPahMw1/IbXT7pUx5iN3A4OSdGJtiMGflzKiou2eQScf+7mtvr4Xradu Byjer04al+qXBKbO6vb1Uil2QjlArK0VsTJgSvAnVtkatb4vKlzWNEPn+EuPCJxpkx7Q +LsTzNOBoIbpypxpP6GxPKb+yP/+528yrvCoaV15N3wptkuIYc9tk5895vTaNKkcnj1/ kX4OOZ69H0eNrKp+fG7hIStA0WXvwsBdCxQf3lDyl0EWzndtz711sJyQNhpmrerKmsd5 00fFS2hPQsXh3ekTA7xghy9PfU1SV0s59xWQQM3d8K+YCgJzKb/q4dMxUuu38HPjYyD9 ZMRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763129822; x=1763734622; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=4oAM1SJwe5be5jeswFgKKg+ScqRvx3vPVGMPIZFDZGA=; b=emTI3iUE3Mcyou6QXK/b6+SHC1SaP3B4eqSEjUwlP7mDuwZemxkvklzu2tpTmWd4aN GgmAGtBSz0W+vidxhhmxuz3cmlpSP3OEY7PC4SefZ7FY3geXBaUirLpMR5u/lku9Hne7 xDS8Bm4H9kJy6QIOPWFNO8866zCbWTAymIBC6/eW97uMkmCqX9IU33uIDaRIKq1zp7Gx lKIqYM/dlVRlAVzoBNZFrPGGqmsobsztPx72EoneHbwv2/pcQ06I5KDEkrkaeMtTDLQZ dWVaNrBLtjKsolmZqWsUFhRX+Eo9I6E7VAizgwqbqQ4azCHSFCOUOAJtKf3bvBhl3sq5 qw0Q== X-Forwarded-Encrypted: i=1; AJvYcCUBcRl1Jl7rDvt9zVec3BRFV9iZNnrJ9FKwi+wnkTlDDYs0s/i9keCN6fVmngpZ5BYsZNfNt+c1dZP6fW0=@vger.kernel.org X-Gm-Message-State: AOJu0YwBUzmR9rO8QYWLGgGTtMASXwY9T7OhfOwsqpkKXmuZCF073OXq J2XwjIx5PBN0K8ByEfMxYtrn3CwtjaWA54Qj9SjOspeGF1u79zC7LDND/2/jy1nk5Rg= X-Gm-Gg: ASbGncsC4av8qZdX8KYY8bnUmvXWLDKkKhwhnwCrxMxbi7m+dOFHiWrbflY72DLOgNf dym6odatq0q4x43/J2bLWNBFiND1jX4DBbpk5STXHCxtpzMguIvHREJHE+xjJs1VqkhPo27p4fq rN0OQripXjEATOFTd3vs34t06LRT2rDHfxPu/nLFlm/pwbnwLA3GBChpjZFPzrjpPHXuM3aNREO X/Ld8dM8wkIOMVkWdafWUbJeek2/agdOBY8orOjzeBIRAx47NEeda06kztfptnkBBDkBPPvvnzA kg3bWputc3IvrCCRRTnUmyttYoitV8q4nPDa5xAE+kL0A0QzXComHct2VRqSY7Jirt9UREdzDQR +b4r5YMel8FCOkH9TMEHKxDjdWCpWWQ4261h2012Es0uqCt/ZUmYgUGoLRORbUgkQbPWO4kd7Tb D7LoTALg2jsHumOnieghiof6QluGS4Fw== X-Google-Smtp-Source: AGHT+IGqRwmbRj/CPbgz3UePg1W1Fi4Jf+p5TO4TwZlqbe762Q/tfUy4KsZ40D0BSKchWnm2kHW4JQ== X-Received: by 2002:a05:6000:24c6:b0:42b:3131:542f with SMTP id ffacd0b85a97d-42b593395b6mr2819075f8f.24.1763129821651; Fri, 14 Nov 2025 06:17:01 -0800 (PST) Received: from gpeter-l.roam.corp.google.com ([145.224.65.83]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-42b53f21948sm10150958f8f.43.2025.11.14.06.16.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Nov 2025 06:17:00 -0800 (PST) From: Peter Griffin Date: Fri, 14 Nov 2025 14:16:48 +0000 Subject: [PATCH v5 1/4] dt-bindings: clock: google,gs101-clock: add samsung,sysreg property as required 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: <20251114-automatic-clocks-v5-1-efb9202ffcd7@linaro.org> References: <20251114-automatic-clocks-v5-0-efb9202ffcd7@linaro.org> In-Reply-To: <20251114-automatic-clocks-v5-0-efb9202ffcd7@linaro.org> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alim Akhtar , =?utf-8?q?Andr=C3=A9_Draszik?= , Tudor Ambarus , Michael Turquette , Stephen Boyd , Sam Protsenko , Sylwester Nawrocki , Chanwoo Choi Cc: Will McVicker , Krzysztof Kozlowski , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, kernel-team@android.com, Peter Griffin , Krzysztof Kozlowski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2886; i=peter.griffin@linaro.org; h=from:subject:message-id; bh=6sKEmCOQ2W5VcemaPNloFrkmil66ilCQ7HCGLcFo2/k=; b=owEBbQKS/ZANAwAKAc7ouNYCNHK6AcsmYgBpFznXNvLBNwl+BCqlq+ASU5nNnrkNHVGOcCAIA c6LVtvJOsSJAjMEAAEKAB0WIQQO/I5vVXh1DVa1SfzO6LjWAjRyugUCaRc51wAKCRDO6LjWAjRy uqU3EACgypkgEzt6O3RuGIUcTAvGF+i3BtDUdztrJqZeT5YnNtFtDpN3U1ocwD2/l92Z/7kIB7D A8IOXDPf7/Dac/8w65lPt5scyF6NJONoYcbVHwUy29QW+iwaHIrnalQexDIjp2SQ6JmKBCGJvPw Hp5cr7exmzHp0aWdLVnk5rriXqB2jZWcGEE43XyOfSLMRW3qhavXpaBVfNaz5NeqLRv+RRtCPbq EvixjewmBsZIyu26wShbPHO/nIG4H6HbC7tbS4v/dPnrawA99p/RvP3aQCHmA1KmtHcMdpnWdc5 xmYIflwltaRET+sz3fxu9mQVA+NEcTFEjP19nw5/+A1L7+kE4g/IImeGVinTg7h5wwsRKQDR7kq 3Vvp/8XzZZW6H2N/tZVOJJ9TNWUjvxuWOO/Q4J1ce4gkexA/POToJWgRAhiRYrl2ge0HB4hZJso zQAKWD4TVa1KtNgucU2jAwSX41m+POJ7ZqWFRlENCUOfgH0cqA6bNpGx0tfldpV8wi1iIGEdPJT LM5FzzLgO1rj7PECYoIHBsYtAmQzf1QdIdzJuzHXgiXgy1XCV9LLbik6t2IAkYp7mjxmk2VeSiP DoY7mQxBT+LwYIMhWvUmmEbWYIgLh7f6mAxhzphC30XKUmxR4a/gb2f65oGJnDe9i0zMiY4eUaK 5GdBP9jOeYtZE4w== X-Developer-Key: i=peter.griffin@linaro.org; a=openpgp; fpr=0EFC8E6F5578750D56B549FCCEE8B8D6023472BA Each CMU (with the exception of cmu_top) has a corresponding sysreg bank that contains the BUSCOMPONENT_DRCG_EN and optional MEMCLK registers. The BUSCOMPONENT_DRCG_EN register enables dynamic root clock gating of bus components and MEMCLK gates the sram clock. Now the clock driver supports automatic clock mode, to fully enable dynamic root clock gating it is required to configure these registers. Update the bindings documentation so that all CMUs (with the exception of gs101-cmu-top) have samsung,sysreg as a required property. Note this is NOT an ABI break, as if the property isn't specified the clock driver will fallback to the current behaviour of not initializing the registers. The system still boots, but bus components won't benefit from dynamic root clock gating and dynamic power will be higher (which has been the case until now anyway). Additionally update the DT example to included the correct CMU size as registers in that region are used for automatic clock mode. Signed-off-by: Peter Griffin Reviewed-by: Andr=C3=A9 Draszik Reviewed-by: Rob Herring (Arm) --- Changes in v5: - Invert the test for google,gs101-cmu-top (Andre) Changes in v4 - Update commit description with additional requested details (Krzysztof) Changes in v3: - Update commit description as to why the sysreg is required (Krzysztof) Changes in v2: - Update commit description regarding updated example (Andre) --- .../devicetree/bindings/clock/google,gs101-clock.yaml | 19 +++++++++++++++= +++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/clock/google,gs101-clock.yam= l b/Documentation/devicetree/bindings/clock/google,gs101-clock.yaml index 31e106ef913dead9a038b3b6d8b43b950587f6aa..09e679c1a9def03d53b8b493929= 911ea902a1763 100644 --- a/Documentation/devicetree/bindings/clock/google,gs101-clock.yaml +++ b/Documentation/devicetree/bindings/clock/google,gs101-clock.yaml @@ -52,6 +52,11 @@ properties: reg: maxItems: 1 =20 + samsung,sysreg: + $ref: /schemas/types.yaml#/definitions/phandle + description: + Phandle to system registers interface. + required: - compatible - "#clock-cells" @@ -166,6 +171,18 @@ allOf: - const: bus - const: ip =20 + - if: + properties: + compatible: + contains: + const: google,gs101-cmu-top + then: + properties: + samsung,sysreg: false + else: + required: + - samsung,sysreg + additionalProperties: false =20 examples: @@ -175,7 +192,7 @@ examples: =20 cmu_top: clock-controller@1e080000 { compatible =3D "google,gs101-cmu-top"; - reg =3D <0x1e080000 0x8000>; + reg =3D <0x1e080000 0x10000>; #clock-cells =3D <1>; clocks =3D <&ext_24_5m>; clock-names =3D "oscclk"; --=20 2.52.0.rc1.455.g30608eb744-goog From nobody Sun Dec 14 11:14:01 2025 Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D9855322C9A for ; Fri, 14 Nov 2025 14:17:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763129826; cv=none; b=f6BupSIxq7fyzEf4LzGCVRmtj2kLp4OS8NuN/RtRVAZ3sJzBzSnXoYPKljZ3eVUOExbjx+SILXRliqL/7isTq0so6jEouHE94ev11PGayYprLU3smJfWiVwj0qeGZWCXKXOx0zR/ZiwKNzLtEQMjl2m3SbxXdXYTNflp24bttis= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763129826; c=relaxed/simple; bh=vvDiIFEQdPmovAX4ucJVT5BHyDxpJSnywN/cD8nxJX8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=g8KzIsuWQR9HTH8XuiCXHgsQHMo9F3YUMEWIZJpdfGFynlig3WVAeeklxVj6OoFzWuKz1QfdblH2gg8w3g23JUHRcbBb6kAUianVteP0r/ruDzc7AOgI9c0lfYhawjrTWKwSZLD+47ux+5QcOOiwFsPBZpQqX7bds1MKUGdPW60= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=KGuILrEz; arc=none smtp.client-ip=209.85.221.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="KGuILrEz" Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-429ce7e79f8so1595864f8f.0 for ; Fri, 14 Nov 2025 06:17:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1763129823; x=1763734623; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=edjMCTWbD64BX5sKIzjpYwFWA+LGAzfeHzBim4j35lA=; b=KGuILrEzPa092jrCyPFMGK1Ku5DLBM0Ve+HFNZ3sGNARoP3augO2KoFuo4tnmFQ7B/ W1wy1F4UjiKfwU4qLLwu/66md83rEZFJxb8VA6h2BPw3fmZvFpl4erJ+92kbSPGnpbaR ydAsa+X4kOkyHpucfEtivt9xUCZknEXvjVe67aQ1ZNE9ZumE6nNbHbsAHrD0uxlzHVgW oy73vleYkb4/znUIubCRM3MxRO9MHRg+dmNLaGY4MRKPQ8ExinhAtxKEnuyz37HkhM/J 7aPUerXbxGydjaD+TM9QSpKFL8qIQzGH5X7PCXJoq85TVTjU4IqUg5diigzKMRyNoJoF n1IQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763129823; x=1763734623; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=edjMCTWbD64BX5sKIzjpYwFWA+LGAzfeHzBim4j35lA=; b=Xm61mLAE06SqRTzON9mYSSJ3iatxb3kXVylc/Uwd4l/hmKDVfNfBlAiutVbvBl71ge g8xjYh7bSPHCsAFMj2G0ZweOe4wNHXH4mYi20AoaP6c4w6UpSvjmGR+OrRPirCZAF9SS xfHwdDs9B3eVHcGohftRCTn2N89ff3vfjFe42K+c41Sv4MjnI6OHNbJR8Ejb+xxRMvee n9nWEve4VUJIgruJdfA+lELmaZG/lgtjRfzLEi8X6V6WVsHniknXeygQpxIBDssIabJi ftwaB+5aMQ0alWPmb0OnamUlZguUWYu+BnmHAC+8rxMz/KI+Ss9sDTLLGtD2oqnvIY+F KPXQ== X-Forwarded-Encrypted: i=1; AJvYcCWYIxGsnW2QE4s+HQAfz9lk8OMyibVuq2sJaWIWjBZamAl8h/OtwWjCcp+16uGHvRvX7CbIHtjJxilGmMo=@vger.kernel.org X-Gm-Message-State: AOJu0Yw/SIi8Gd8PDtDzoannOYnb0yZSGag4nxWj7ak+N1RMht07dJqr sH6SOU6kO6zatIQCE1u1xyNtj0VsNVv1IbYY6wkDIDsKh4YxDZLw3zcAeKOe6i11yz0= X-Gm-Gg: ASbGncuBeQCOtJnjmN9D6hqe0k33C+Y4WojNQFHcaid9kOeXIlhr0pQTgoYqR45ZFD6 7hvqQdRZo4E76Ps/KSKSzsLfz1ntxkH5+nHfRKpHvMR1BQw60yim/MxhWiVG6yyNu8TPILjW0tP FFHwfJfcHm8Z1PX1EK4XZ+EjDFpi5rJkgAZT+QdzP0foizYimMOY5tVwjfN+qIChSrFSHqzP2rh JaCJcyc8ucBwLWCMSkzHSn6u2VHJa3fbvf3kdpEoNpUIl2bN0ff1ugIU/rfxqVzl8zwwbnDhnOE pdLShxNCbaSLmQxBOqTwAjCMPYk8M5CEFz0UO8O2UfTBImIxhgebMc1/f3Wp4/kIzfjbNmGwBEn 10ITthKNYBmmdFes4yb2Y1ywE2gYXS+LA58pIxIQsJdG9GSatW0qiXwEKxxMUQnk8kExR7GTfCl FCKltRbCdjST22CEOfxdiNwuGDTZhyIA== X-Google-Smtp-Source: AGHT+IHL7jYF6WGNufs+vkyuP/U+Oh47CgmLkTpkbSqQCZMz0n5GmB64VlJIPQWWhQES2TnYh0lzKg== X-Received: by 2002:a05:6000:1ace:b0:42b:3978:1587 with SMTP id ffacd0b85a97d-42b59381be5mr3622429f8f.36.1763129823112; Fri, 14 Nov 2025 06:17:03 -0800 (PST) Received: from gpeter-l.roam.corp.google.com ([145.224.65.83]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-42b53f21948sm10150958f8f.43.2025.11.14.06.17.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Nov 2025 06:17:02 -0800 (PST) From: Peter Griffin Date: Fri, 14 Nov 2025 14:16:49 +0000 Subject: [PATCH v5 2/4] arm64: dts: exynos: gs101: add samsung,sysreg property to CMU nodes 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: <20251114-automatic-clocks-v5-2-efb9202ffcd7@linaro.org> References: <20251114-automatic-clocks-v5-0-efb9202ffcd7@linaro.org> In-Reply-To: <20251114-automatic-clocks-v5-0-efb9202ffcd7@linaro.org> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alim Akhtar , =?utf-8?q?Andr=C3=A9_Draszik?= , Tudor Ambarus , Michael Turquette , Stephen Boyd , Sam Protsenko , Sylwester Nawrocki , Chanwoo Choi Cc: Will McVicker , Krzysztof Kozlowski , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, kernel-team@android.com, Peter Griffin , Krzysztof Kozlowski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2743; i=peter.griffin@linaro.org; h=from:subject:message-id; bh=vvDiIFEQdPmovAX4ucJVT5BHyDxpJSnywN/cD8nxJX8=; b=owEBbQKS/ZANAwAKAc7ouNYCNHK6AcsmYgBpFznYdDgdArWryoZNC0/MrWhCS17nZdqxVoSZo s+gr5SKBWSJAjMEAAEKAB0WIQQO/I5vVXh1DVa1SfzO6LjWAjRyugUCaRc52AAKCRDO6LjWAjRy unTzEACJjrMTtBxf19XpqpgBtDyjz86m/+UVUDhvGd6wILF5z7VHYoMoTZlkroiPR0bxvPESYxu OzdQYB3YuizxqAdtoGu8EeDpccS/dtxrTq3c9FyaFmHcu23Y6W5cmdVBWhh8Ols6QxQDG24eXbX NmxJyPV38QVFWKjUgfHn1deA8n/th2NM7WPoe9T8EmJzVSehOI3Ej5trqlSIeNodZ4LKzat9ACg ulhJKbHa05oZ1E4A+Qp6h+6RsZ2wtU3c+4xz4QlYJbpRniJgy3j75DiqGw1g3CTOaK4a2cL1BM3 oe3z8pX/l5G6F7LpFrYDkuN8sWULDhzArwt/eGv0O4Q0A4AJL0pqYlDlzb2+9uPvzaT3hK9hxW1 qmLwGTV49uzv/f1qGJl+qp24mZXJ6TIDEkeziMF6PbOUXTg+3TP/RT3gdyhracN1TSSIkmK54jq ciepYZeeld+hRWrOukqUCEliBOs7TegJFOCQ8EFePRqX+v2xEQ9s+YcBn2rSes5VZ6jPDmi7PKC TqyKbWmVsqgrR+OqWpfSVAiMBURrB/Y67XnyCxasSdwscUscee8Idv2r0Ycovtvo5sscawSokUj SRlVHvq31ENpeC8yM3Ryz4nwCZAp4Gs/DtOfSgtFEbJIiLvNnI2jmsl1d2t2Qu66wdu/5yALgNK kNBZXqX+5cV4xGQ== X-Developer-Key: i=peter.griffin@linaro.org; a=openpgp; fpr=0EFC8E6F5578750D56B549FCCEE8B8D6023472BA With the exception of cmu_top, each CMU has a corresponding sysreg bank that contains the BUSCOMPONENT_DRCG_EN and optional MEMCLK registers. The BUSCOMPONENT_DRCG_EN register enables dynamic root clock gating of bus components and MEMCLK gates the sram clock. Now the clock driver supports automatic clock mode, provide the samsung,sysreg property so the driver can enable dynamic root clock gating of bus components and gate sram clock. Note without the property specified the driver simply falls back to previous behaviour of not configuring these registers so it is not an ABI break. Signed-off-by: Peter Griffin --- Changes in v4: - Update commit message (Peter) --- arch/arm64/boot/dts/exynos/google/gs101.dtsi | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/arch/arm64/boot/dts/exynos/google/gs101.dtsi b/arch/arm64/boot= /dts/exynos/google/gs101.dtsi index d06d1d05f36408137a8acd98e43d48ea7d4f4292..c39ca4c4508f046ca16ae86be42= 468c7245561b8 100644 --- a/arch/arm64/boot/dts/exynos/google/gs101.dtsi +++ b/arch/arm64/boot/dts/exynos/google/gs101.dtsi @@ -578,6 +578,7 @@ cmu_misc: clock-controller@10010000 { clocks =3D <&cmu_top CLK_DOUT_CMU_MISC_BUS>, <&cmu_top CLK_DOUT_CMU_MISC_SSS>; clock-names =3D "bus", "sss"; + samsung,sysreg =3D <&sysreg_misc>; }; =20 sysreg_misc: syscon@10030000 { @@ -662,6 +663,7 @@ cmu_peric0: clock-controller@10800000 { <&cmu_top CLK_DOUT_CMU_PERIC0_BUS>, <&cmu_top CLK_DOUT_CMU_PERIC0_IP>; clock-names =3D "oscclk", "bus", "ip"; + samsung,sysreg =3D <&sysreg_peric0>; }; =20 sysreg_peric0: syscon@10820000 { @@ -1208,6 +1210,7 @@ cmu_peric1: clock-controller@10c00000 { <&cmu_top CLK_DOUT_CMU_PERIC1_BUS>, <&cmu_top CLK_DOUT_CMU_PERIC1_IP>; clock-names =3D "oscclk", "bus", "ip"; + samsung,sysreg =3D <&sysreg_peric1>; }; =20 sysreg_peric1: syscon@10c20000 { @@ -1566,6 +1569,7 @@ cmu_hsi0: clock-controller@11000000 { <&cmu_top CLK_DOUT_CMU_HSI0_USBDPDBG>; clock-names =3D "oscclk", "bus", "dpgtc", "usb31drd", "usbdpdbg"; + samsung,sysreg =3D <&sysreg_hsi0>; }; =20 sysreg_hsi0: syscon@11020000 { @@ -1637,6 +1641,7 @@ cmu_hsi2: clock-controller@14400000 { <&cmu_top CLK_DOUT_CMU_HSI2_UFS_EMBD>, <&cmu_top CLK_DOUT_CMU_HSI2_MMC_CARD>; clock-names =3D "oscclk", "bus", "pcie", "ufs", "mmc"; + samsung,sysreg =3D <&sysreg_hsi2>; }; =20 sysreg_hsi2: syscon@14420000 { @@ -1697,6 +1702,7 @@ cmu_apm: clock-controller@17400000 { =20 clocks =3D <&ext_24_5m>; clock-names =3D "oscclk"; + samsung,sysreg =3D <&sysreg_apm>; }; =20 sysreg_apm: syscon@17420000 { --=20 2.52.0.rc1.455.g30608eb744-goog From nobody Sun Dec 14 11:14:01 2025 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 96AF0325715 for ; Fri, 14 Nov 2025 14:17:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763129830; cv=none; b=fmtMKGIhcrmXULKRYUo3ViyiZb/gzcyWaOPslZRmMLt4FrTLOoZvDCLh0Ym6s2pmdhhig3spfiuYqzCsJtdj+v2yKs/NMqEnZC14ZRpz+rFPLbUJjxTaapbArMxQcYOukdOEC78HyxTSZN71aAmsqTiesbI3F3emp1ecsbJIZ94= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763129830; c=relaxed/simple; bh=wfPjpdJF4AJnNfWlV1E3KTHLxs2t4dyjEt7sC9s+TIg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AqUpNIHj0tovPUh2FRHawOxNfkLksBGKKcOEjomEmh1d324w2gDwwPKFkGi2hVSQ4mtUO3kIdHwYYTSiDehCEpzTC6oFsK4e7yEGowQ7q/lEAmtqIvozPClZB9y2UvJtE0Wf2YQCO7HE3woyfjRIR/iB5RBv3ZhzTrvDNnho9Yk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=un1QN6rp; arc=none smtp.client-ip=209.85.221.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="un1QN6rp" Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-42b312a089fso1201172f8f.2 for ; Fri, 14 Nov 2025 06:17:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1763129825; x=1763734625; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=HAnKK5MmSlaapGCkTvjzWHoK3WLS4Lpo3bQSg7TNXLM=; b=un1QN6rpaB1egmYrGx1thy1W1+w7SORY4WIjVtn85U9ljRdsC/9aZ/SIGb/1KePKRN D0tYXgePO84bWk5hp73F720pkm4nfilO5DV5w+YCAanIZt41Etgh5n9ED5hP+0orSjVq 4FwfYstZRBtwJzmQycfkWTILDvAoHuExL1XX08BZjBNaZFB/6rzARpfkVmDWpFP0RHji Z9BMjhVHDVOzq56FgsSQ15n2S0G4XvWypEzkC3Wdrspbngh/1lcwCJEitjtUw9JZmPGp RX5Ij8GBbKMw8zXMiXPu6R6PBh1vwxqa5l0eACnuCNSM82Pw7+oIYjAITaCvPmWFP8q0 Bklg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763129825; x=1763734625; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=HAnKK5MmSlaapGCkTvjzWHoK3WLS4Lpo3bQSg7TNXLM=; b=Y7MbPRROksP56sXojDIBGm26I1xbNONVo3d51qufNvekwgchyqJvKPYUeEQ0JzIoyA FVBBs/E4uwStHmHDtFNfQ5hoBQc1UBBXskSOWYt8AckBa35bXsesufjpGFLVKWvyLFwn gS/pB8MYScJ+YlOpDqJSsbVHE0ZBoVeJ8ejc7IoK1zzM9HkARNm90p/V2bsSP5EVoiAZ guF1bC5LY5JfhTL6N5IBwvAyIFzef6waL8YyjAtTmkphkaejs22FzNT9sYUz5MW7lXmC DRSJ0G1w2kjcD+Y6jlTk3P+oaNj1hZI0qKZ1VGiybJ/RN62Vb7xxA16T+Ewq7RcHJQBy apbA== X-Forwarded-Encrypted: i=1; AJvYcCULGTaZhUV0bifLloGd+9dpJeRa9Qfe91udqQ5FsnqvhyT/1Y4W0/Hjo37nXiP4d3MU+cTCjE5ykrVUTSk=@vger.kernel.org X-Gm-Message-State: AOJu0YzAO8FV2ZevjrWqeRb5xibBrTkz8/ih64vkjwIyQAkiSIbZp8aY znJncWA7oc75HUlK1U4t+kS8uH4S4LnCW1Aqy2dpHGDitwJ/FJlBPkWiK3t66AmOLbw= X-Gm-Gg: ASbGnct3/YmkJcySJtFcqU6JsSPEUKZzFNPivfvO+LOzNhgfXqovS0UsV4FPD6kkPH2 yi4KR+8a9P0e4WGMFe7bdG/Zn5VrhPD20drRCKbBAVBybwEpJStzrA085kxDrOg/RUL/AXJPTI1 faxAB2Ngt5z6bSXTiOdKt1VJeIxS107v8VYMRSW8Wl5Ic3HA6zcr2rt5XyWBhz3tITmVfb7TMTq m19YPfuBbxlvJ/6pm9VG82qZHg2r7gMYbw5L6NSmdILH/DgwWY3Q//oATruYX6g4IpnMcIDEtEJ +73wzwAjnJv90T8EskzN4PhR4FWahT2luPuL+B6+Vj9wkUv37fM3a8a7Kl22rOhElc9Ru/FDm7s c78qz+iaOhxMUbWhZnxaUaed6dbdR/VyG2nlIGYao4e+r7p1pdOXQLzYwnfNAY8MpVHpWKgCvd8 Z1dV0orT0qNfV5/O36nqZONVzxonq5tA== X-Google-Smtp-Source: AGHT+IEhh6CEPvK2CpR3ujJO/QpK9Zy0v7lYmi8wS2OF7nvQcO5Jmeo1KOl/SwbEa+CQ7mNkmUagdg== X-Received: by 2002:a05:6000:1863:b0:429:c7dc:e613 with SMTP id ffacd0b85a97d-42b593679bfmr2695288f8f.41.1763129824614; Fri, 14 Nov 2025 06:17:04 -0800 (PST) Received: from gpeter-l.roam.corp.google.com ([145.224.65.83]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-42b53f21948sm10150958f8f.43.2025.11.14.06.17.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Nov 2025 06:17:04 -0800 (PST) From: Peter Griffin Date: Fri, 14 Nov 2025 14:16:50 +0000 Subject: [PATCH v5 3/4] clk: samsung: Implement automatic clock gating mode for CMUs 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: <20251114-automatic-clocks-v5-3-efb9202ffcd7@linaro.org> References: <20251114-automatic-clocks-v5-0-efb9202ffcd7@linaro.org> In-Reply-To: <20251114-automatic-clocks-v5-0-efb9202ffcd7@linaro.org> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alim Akhtar , =?utf-8?q?Andr=C3=A9_Draszik?= , Tudor Ambarus , Michael Turquette , Stephen Boyd , Sam Protsenko , Sylwester Nawrocki , Chanwoo Choi Cc: Will McVicker , Krzysztof Kozlowski , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, kernel-team@android.com, Peter Griffin , Krzysztof Kozlowski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=29440; i=peter.griffin@linaro.org; h=from:subject:message-id; bh=wfPjpdJF4AJnNfWlV1E3KTHLxs2t4dyjEt7sC9s+TIg=; b=owEBbQKS/ZANAwAKAc7ouNYCNHK6AcsmYgBpFznYV/KYn/8fG41B4eJK/6aDtr+4gTgG3X8Vv ggjOr9TE3eJAjMEAAEKAB0WIQQO/I5vVXh1DVa1SfzO6LjWAjRyugUCaRc52AAKCRDO6LjWAjRy ulEFD/9g3wDWKuk2PrRbSy/qlKqCiWBcEdYFMSXQjfim3qFYmpmSK20FlUZ4X4yCoWp7N38DoHl t5MdlsKRm5YVWLS0buOT9UNq4Zp/CPjWdCH/1WjFILb4TxSE7m5iGlfIqLqIsg/uWdJ0Z3cfSMO eiflN8v096AkkJTbFDPkd/ZRHkCu2MxtsQNTvp6Qx+Tz8S/jKPOq3mU/vde4kmmuJJrWbDFo676 q8mz1ja54CIdynwmEir3UlV4QY7L1m7hJmy8/gRp3k0n/qFqF4XkBqWRJn5EieEqEr2fpi8IYUA o8G29/oGm5XK+VpiK5znZ74udrYT8GM2S6qfMuXJACMjdD0rL+p/WkAqy8D1cHw7e+Y8VZnzV1E e5UYHGDC4lGbypV0Gg45vLlybqafEyHE5lGEwEA7n5YVYcr2ATRMPOBwUz6mVETwZHA3kTIj30D lNCrnA3aAOAza0figTuZaOZjpfDAnFvpm9NhIRM4loRpyShOoapXP8nvFqbDEFzmZjl6XPQ/APO +lsOj222SvA3ndJuDoUoxvXJqgE2RUlx+HuAR9KeRZ9JP6cYFfh+6+t4lHpj2cccQGqcv6Tbzcz xQRmWyoq+MUEIF5ceJpEsAohTm/juQycCVmQmSQv17lapowcoPzsb/BalujP6bBHVMK6LnbDG/6 0ZxUsVbTg2aqrnQ== X-Developer-Key: i=peter.griffin@linaro.org; a=openpgp; fpr=0EFC8E6F5578750D56B549FCCEE8B8D6023472BA Update exynos_arm64_init_clocks() so that it enables the automatic clock mode bits in the CMU option register if the auto_clock_gate flag and option_offset fields are set for the CMU. To ensure compatibility with older DTs (that specified an incorrect CMU reg size), detect this and fallback to manual clock gate mode as the auto clock mode feature depends on registers in this area. The CMU option register bits are global and effect every clock component in the CMU, as such clearing the GATE_ENABLE_HWACG bit and setting GATE_MANUAL bit on every gate register is only required if auto_clock_gate is false. Additionally if auto_clock_gate is enabled the dynamic root clock gating and memclk registers will be configured in the corresponding CMUs sysreg bank. These registers are exposed via syscon, so the register samsung_clk_save/restore paths are updated to also take a regmap. As many gates for various Samsung SoCs are already exposed in the Samsung clock drivers a new samsung_auto_clk_gate_ops is implemented. This uses some CMU debug registers to report whether clocks are enabled or disabled when operating in automatic mode. This allows /sys/kernel/debug/clk/clk_summary to still dump the entire clock tree and correctly report the status of each clock in the system. Signed-off-by: Peter Griffin --- Changes in v3: - Add missing 'np' func param to kerneldoc in samsung_cmu_register_clocks (0-DAY CI) Changes in v2: - Fallback to manual clock gate mode for old DTs with incorrect CMU size (added samsung_is_auto_capable()) (Krzysztof) - Rename OPT_UNKNOWN bit to OPT_EN_LAYER2_CTRL (Andre) - Rename OPT_EN_MEM_PM_GATING to OPT_EN_MEM_PWR_GATING (Andre) - Reverse Option bit definitions LSB -> MSB (Krzysztof) - Update kerneldoc init_clk_regs comment (Andre) - Fix space on various comments (Andre) - Fix regmap typo on samsung_clk_save/restore calls (Andre) - Include error code in pr_err message (Andre) - Add macros for dcrg and memclk (Andre) - Avoid confusing !IS_ERR_OR_NULL(ctx->sysreg) test (Krzysztof) - Update kerneldoc to mention drcg_offset & memclk_offset are in sysreg (An= dre) - Fix 0-DAY CI randconfig warning (0-DAY CI) - Update clk-s5pv210 and clk-s3c64xx.c samsung_clk_sleep_init call sites (P= eter) --- drivers/clk/samsung/clk-exynos-arm64.c | 62 ++++++++-- drivers/clk/samsung/clk-exynos4.c | 12 +- drivers/clk/samsung/clk-exynos4412-isp.c | 4 +- drivers/clk/samsung/clk-exynos5250.c | 2 +- drivers/clk/samsung/clk-exynos5420.c | 4 +- drivers/clk/samsung/clk-s3c64xx.c | 4 +- drivers/clk/samsung/clk-s5pv210.c | 2 +- drivers/clk/samsung/clk.c | 200 +++++++++++++++++++++++++++= +--- drivers/clk/samsung/clk.h | 55 ++++++++- 9 files changed, 302 insertions(+), 43 deletions(-) diff --git a/drivers/clk/samsung/clk-exynos-arm64.c b/drivers/clk/samsung/c= lk-exynos-arm64.c index bf7de21f329ec89069dcf817ca578fcf9b2d9809..11e4d49f2390ba714eff5a329bb= 1f427cd6437b9 100644 --- a/drivers/clk/samsung/clk-exynos-arm64.c +++ b/drivers/clk/samsung/clk-exynos-arm64.c @@ -24,6 +24,16 @@ #define GATE_MANUAL BIT(20) #define GATE_ENABLE_HWACG BIT(28) =20 +/* Option register bits */ +#define OPT_EN_MEM_PWR_GATING BIT(24) +#define OPT_EN_AUTO_GATING BIT(28) +#define OPT_EN_PWR_MANAGEMENT BIT(29) +#define OPT_EN_LAYER2_CTRL BIT(30) +#define OPT_EN_DBG BIT(31) + +#define CMU_OPT_GLOBAL_EN_AUTO_GATING (OPT_EN_DBG | OPT_EN_LAYER2_CTRL | \ + OPT_EN_PWR_MANAGEMENT | OPT_EN_AUTO_GATING | OPT_EN_MEM_PWR_GATING) + /* PLL_CONx_PLL register offsets range */ #define PLL_CON_OFF_START 0x100 #define PLL_CON_OFF_END 0x600 @@ -37,6 +47,8 @@ struct exynos_arm64_cmu_data { unsigned int nr_clk_save; const struct samsung_clk_reg_dump *clk_suspend; unsigned int nr_clk_suspend; + struct samsung_clk_reg_dump *clk_sysreg_save; + unsigned int nr_clk_sysreg; =20 struct clk *clk; struct clk **pclks; @@ -76,19 +88,41 @@ static void __init exynos_arm64_init_clocks(struct devi= ce_node *np, const unsigned long *reg_offs =3D cmu->clk_regs; size_t reg_offs_len =3D cmu->nr_clk_regs; void __iomem *reg_base; + bool init_auto; size_t i; =20 reg_base =3D of_iomap(np, 0); if (!reg_base) panic("%s: failed to map registers\n", __func__); =20 + /* ensure compatibility with older DTs */ + if (cmu->auto_clock_gate && samsung_is_auto_capable(np)) + init_auto =3D true; + else + init_auto =3D false; + + if (cmu->option_offset && init_auto) { + /* + * Enable the global automatic mode for the entire CMU. + * This overrides the individual HWACG bits in each of the + * individual gate, mux and qch registers. + */ + writel(CMU_OPT_GLOBAL_EN_AUTO_GATING, + reg_base + cmu->option_offset); + } + for (i =3D 0; i < reg_offs_len; ++i) { void __iomem *reg =3D reg_base + reg_offs[i]; u32 val; =20 if (cmu->manual_plls && is_pll_con1_reg(reg_offs[i])) { writel(PLL_CON1_MANUAL, reg); - } else if (is_gate_reg(reg_offs[i])) { + } else if (is_gate_reg(reg_offs[i]) && !init_auto) { + /* + * Setting GATE_MANUAL bit (which is described in TRM as + * reserved!) overrides the global CMU automatic mode + * option. + */ val =3D readl(reg); val |=3D GATE_MANUAL; val &=3D ~GATE_ENABLE_HWACG; @@ -210,8 +244,8 @@ void __init exynos_arm64_register_cmu(struct device *de= v, /** * exynos_arm64_register_cmu_pm - Register Exynos CMU domain with PM suppo= rt * - * @pdev: Platform device object - * @set_manual: If true, set gate clocks to manual mode + * @pdev: Platform device object + * @init_clk_regs: If true, initialize CMU registers * * It's a version of exynos_arm64_register_cmu() with PM support. Should be * called from probe function of platform driver. @@ -219,7 +253,7 @@ void __init exynos_arm64_register_cmu(struct device *de= v, * Return: 0 on success, or negative error code on error. */ int __init exynos_arm64_register_cmu_pm(struct platform_device *pdev, - bool set_manual) + bool init_clk_regs) { const struct samsung_cmu_info *cmu; struct device *dev =3D &pdev->dev; @@ -249,7 +283,7 @@ int __init exynos_arm64_register_cmu_pm(struct platform= _device *pdev, dev_err(dev, "%s: could not enable bus clock %s; err =3D %d\n", __func__, cmu->clk_name, ret); =20 - if (set_manual) + if (init_clk_regs) exynos_arm64_init_clocks(np, cmu); =20 reg_base =3D devm_platform_ioremap_resource(pdev, 0); @@ -268,8 +302,10 @@ int __init exynos_arm64_register_cmu_pm(struct platfor= m_device *pdev, pm_runtime_set_active(dev); pm_runtime_enable(dev); =20 - samsung_cmu_register_clocks(data->ctx, cmu); + samsung_cmu_register_clocks(data->ctx, cmu, np); samsung_clk_of_add_provider(dev->of_node, data->ctx); + /* sysreg DT nodes reference a clock in this CMU */ + samsung_en_dyn_root_clk_gating(np, data->ctx, cmu); pm_runtime_put_sync(dev); =20 return 0; @@ -280,14 +316,17 @@ int exynos_arm64_cmu_suspend(struct device *dev) struct exynos_arm64_cmu_data *data =3D dev_get_drvdata(dev); int i; =20 - samsung_clk_save(data->ctx->reg_base, data->clk_save, + samsung_clk_save(data->ctx->reg_base, NULL, data->clk_save, data->nr_clk_save); =20 + samsung_clk_save(NULL, data->ctx->sysreg, data->clk_sysreg_save, + data->nr_clk_sysreg); + for (i =3D 0; i < data->nr_pclks; i++) clk_prepare_enable(data->pclks[i]); =20 /* For suspend some registers have to be set to certain values */ - samsung_clk_restore(data->ctx->reg_base, data->clk_suspend, + samsung_clk_restore(data->ctx->reg_base, NULL, data->clk_suspend, data->nr_clk_suspend); =20 for (i =3D 0; i < data->nr_pclks; i++) @@ -308,9 +347,14 @@ int exynos_arm64_cmu_resume(struct device *dev) for (i =3D 0; i < data->nr_pclks; i++) clk_prepare_enable(data->pclks[i]); =20 - samsung_clk_restore(data->ctx->reg_base, data->clk_save, + samsung_clk_restore(data->ctx->reg_base, NULL, data->clk_save, data->nr_clk_save); =20 + if (data->ctx->sysreg) + samsung_clk_restore(NULL, data->ctx->sysreg, + data->clk_sysreg_save, + data->nr_clk_sysreg); + for (i =3D 0; i < data->nr_pclks; i++) clk_disable_unprepare(data->pclks[i]); =20 diff --git a/drivers/clk/samsung/clk-exynos4.c b/drivers/clk/samsung/clk-ex= ynos4.c index cc5c1644c41c08b27bc48d809a08cd8a006cbe8f..246bd28bac2d577a58a7b9e0e93= b700548370a36 100644 --- a/drivers/clk/samsung/clk-exynos4.c +++ b/drivers/clk/samsung/clk-exynos4.c @@ -1361,12 +1361,12 @@ static void __init exynos4_clk_init(struct device_n= ode *np, ARRAY_SIZE(exynos4x12_plls)); } =20 - samsung_cmu_register_clocks(ctx, &cmu_info_exynos4); + samsung_cmu_register_clocks(ctx, &cmu_info_exynos4, np); =20 if (exynos4_soc =3D=3D EXYNOS4210) { - samsung_cmu_register_clocks(ctx, &cmu_info_exynos4210); + samsung_cmu_register_clocks(ctx, &cmu_info_exynos4210, np); } else { - samsung_cmu_register_clocks(ctx, &cmu_info_exynos4x12); + samsung_cmu_register_clocks(ctx, &cmu_info_exynos4x12, np); if (soc =3D=3D EXYNOS4412) samsung_clk_register_cpu(ctx, exynos4412_cpu_clks, ARRAY_SIZE(exynos4412_cpu_clks)); @@ -1378,15 +1378,15 @@ static void __init exynos4_clk_init(struct device_n= ode *np, if (soc =3D=3D EXYNOS4212 || soc =3D=3D EXYNOS4412) exynos4x12_core_down_clock(); =20 - samsung_clk_extended_sleep_init(reg_base, + samsung_clk_extended_sleep_init(reg_base, NULL, exynos4_clk_regs, ARRAY_SIZE(exynos4_clk_regs), src_mask_suspend, ARRAY_SIZE(src_mask_suspend)); if (exynos4_soc =3D=3D EXYNOS4210) - samsung_clk_extended_sleep_init(reg_base, + samsung_clk_extended_sleep_init(reg_base, NULL, exynos4210_clk_save, ARRAY_SIZE(exynos4210_clk_save), src_mask_suspend_e4210, ARRAY_SIZE(src_mask_suspend_e4210)); else - samsung_clk_sleep_init(reg_base, exynos4x12_clk_save, + samsung_clk_sleep_init(reg_base, NULL, exynos4x12_clk_save, ARRAY_SIZE(exynos4x12_clk_save)); =20 samsung_clk_of_add_provider(np, ctx); diff --git a/drivers/clk/samsung/clk-exynos4412-isp.c b/drivers/clk/samsung= /clk-exynos4412-isp.c index fa915057e109e0008ebe0b1b5d1652fd5804e82b..772bc18a1e686f23b11bf160b80= 3becff6279637 100644 --- a/drivers/clk/samsung/clk-exynos4412-isp.c +++ b/drivers/clk/samsung/clk-exynos4412-isp.c @@ -94,7 +94,7 @@ static int __maybe_unused exynos4x12_isp_clk_suspend(stru= ct device *dev) { struct samsung_clk_provider *ctx =3D dev_get_drvdata(dev); =20 - samsung_clk_save(ctx->reg_base, exynos4x12_save_isp, + samsung_clk_save(ctx->reg_base, NULL, exynos4x12_save_isp, ARRAY_SIZE(exynos4x12_clk_isp_save)); return 0; } @@ -103,7 +103,7 @@ static int __maybe_unused exynos4x12_isp_clk_resume(str= uct device *dev) { struct samsung_clk_provider *ctx =3D dev_get_drvdata(dev); =20 - samsung_clk_restore(ctx->reg_base, exynos4x12_save_isp, + samsung_clk_restore(ctx->reg_base, NULL, exynos4x12_save_isp, ARRAY_SIZE(exynos4x12_clk_isp_save)); return 0; } diff --git a/drivers/clk/samsung/clk-exynos5250.c b/drivers/clk/samsung/clk= -exynos5250.c index e90d3a0848cbc24b2709c10795f6affcda404567..f97f30b29be7317db8186bac39c= f52e1893eb106 100644 --- a/drivers/clk/samsung/clk-exynos5250.c +++ b/drivers/clk/samsung/clk-exynos5250.c @@ -854,7 +854,7 @@ static void __init exynos5250_clk_init(struct device_no= de *np) PWR_CTRL2_CORE2_UP_RATIO | PWR_CTRL2_CORE1_UP_RATIO); __raw_writel(tmp, reg_base + PWR_CTRL2); =20 - samsung_clk_sleep_init(reg_base, exynos5250_clk_regs, + samsung_clk_sleep_init(reg_base, NULL, exynos5250_clk_regs, ARRAY_SIZE(exynos5250_clk_regs)); exynos5_subcmus_init(ctx, ARRAY_SIZE(exynos5250_subcmus), exynos5250_subcmus); diff --git a/drivers/clk/samsung/clk-exynos5420.c b/drivers/clk/samsung/clk= -exynos5420.c index a9df4e6db82fa7831d4e5c7210b0163d7d301ec1..1982e0751ceec7e57f9e82d96dc= badce1f691092 100644 --- a/drivers/clk/samsung/clk-exynos5420.c +++ b/drivers/clk/samsung/clk-exynos5420.c @@ -1649,12 +1649,12 @@ static void __init exynos5x_clk_init(struct device_= node *np, ARRAY_SIZE(exynos5800_cpu_clks)); } =20 - samsung_clk_extended_sleep_init(reg_base, + samsung_clk_extended_sleep_init(reg_base, NULL, exynos5x_clk_regs, ARRAY_SIZE(exynos5x_clk_regs), exynos5420_set_clksrc, ARRAY_SIZE(exynos5420_set_clksrc)); =20 if (soc =3D=3D EXYNOS5800) { - samsung_clk_sleep_init(reg_base, exynos5800_clk_regs, + samsung_clk_sleep_init(reg_base, NULL, exynos5800_clk_regs, ARRAY_SIZE(exynos5800_clk_regs)); =20 exynos5_subcmus_init(ctx, ARRAY_SIZE(exynos5800_subcmus), diff --git a/drivers/clk/samsung/clk-s3c64xx.c b/drivers/clk/samsung/clk-s3= c64xx.c index 397a057af5d1e704e7ead7ba04b477fdc28c45bf..5a2d5a5703ffc5ed48b9a18a20c= 39be2de827920 100644 --- a/drivers/clk/samsung/clk-s3c64xx.c +++ b/drivers/clk/samsung/clk-s3c64xx.c @@ -449,10 +449,10 @@ void __init s3c64xx_clk_init(struct device_node *np, = unsigned long xtal_f, samsung_clk_register_alias(ctx, s3c64xx_clock_aliases, ARRAY_SIZE(s3c64xx_clock_aliases)); =20 - samsung_clk_sleep_init(reg_base, s3c64xx_clk_regs, + samsung_clk_sleep_init(reg_base, NULL, s3c64xx_clk_regs, ARRAY_SIZE(s3c64xx_clk_regs)); if (!is_s3c6400) - samsung_clk_sleep_init(reg_base, s3c6410_clk_regs, + samsung_clk_sleep_init(reg_base, NULL, s3c6410_clk_regs, ARRAY_SIZE(s3c6410_clk_regs)); =20 samsung_clk_of_add_provider(np, ctx); diff --git a/drivers/clk/samsung/clk-s5pv210.c b/drivers/clk/samsung/clk-s5= pv210.c index 9a4217cc1908aa60ebbe51b2b5c841138cc46ef3..4ee4f2b5efbc1d4770fefff22de= 21f7d4e5e9506 100644 --- a/drivers/clk/samsung/clk-s5pv210.c +++ b/drivers/clk/samsung/clk-s5pv210.c @@ -782,7 +782,7 @@ static void __init __s5pv210_clk_init(struct device_nod= e *np, samsung_clk_register_alias(ctx, s5pv210_aliases, ARRAY_SIZE(s5pv210_aliases)); =20 - samsung_clk_sleep_init(reg_base, s5pv210_clk_regs, + samsung_clk_sleep_init(reg_base, NULL, s5pv210_clk_regs, ARRAY_SIZE(s5pv210_clk_regs)); =20 samsung_clk_of_add_provider(np, ctx); diff --git a/drivers/clk/samsung/clk.c b/drivers/clk/samsung/clk.c index dbc9925ca8f46e951dfb5d391c0e744ca370abcc..83de526346bc06c811beac3667b= ab482e2eca7b8 100644 --- a/drivers/clk/samsung/clk.c +++ b/drivers/clk/samsung/clk.c @@ -12,8 +12,10 @@ #include #include #include +#include #include #include +#include #include =20 #include "clk.h" @@ -21,19 +23,29 @@ static LIST_HEAD(clock_reg_cache_list); =20 void samsung_clk_save(void __iomem *base, + struct regmap *regmap, struct samsung_clk_reg_dump *rd, unsigned int num_regs) { - for (; num_regs > 0; --num_regs, ++rd) - rd->value =3D readl(base + rd->offset); + for (; num_regs > 0; --num_regs, ++rd) { + if (base) + rd->value =3D readl(base + rd->offset); + else if (regmap) + regmap_read(regmap, rd->offset, &rd->value); + } } =20 void samsung_clk_restore(void __iomem *base, + struct regmap *regmap, const struct samsung_clk_reg_dump *rd, unsigned int num_regs) { - for (; num_regs > 0; --num_regs, ++rd) - writel(rd->value, base + rd->offset); + for (; num_regs > 0; --num_regs, ++rd) { + if (base) + writel(rd->value, base + rd->offset); + else if (regmap) + regmap_write(regmap, rd->offset, rd->value); + } } =20 struct samsung_clk_reg_dump *samsung_clk_alloc_reg_dump( @@ -227,6 +239,103 @@ void __init samsung_clk_register_div(struct samsung_c= lk_provider *ctx, } } =20 +/* + * Some older DT's have an incorrect CMU resource size which is incompatib= le + * with the auto clock mode feature. In such cases we switch back to manual + * clock gating mode. + */ +bool samsung_is_auto_capable(struct device_node *np) +{ + struct resource res; + resource_size_t size; + + if (of_address_to_resource(np, 0, &res)) + return false; + + size =3D resource_size(&res); + if (size !=3D 0x10000) { + pr_warn("%pOF: incorrect res size for automatic clocks\n", np); + return false; + } + return true; +} + +#define ACG_MSK GENMASK(6, 4) +#define CLK_IDLE GENMASK(5, 4) +static int samsung_auto_clk_gate_is_en(struct clk_hw *hw) +{ + u32 reg; + struct clk_gate *gate =3D to_clk_gate(hw); + + reg =3D readl(gate->reg); + return ((reg & ACG_MSK) =3D=3D CLK_IDLE) ? 0 : 1; +} + +/* enable and disable are nops in automatic clock mode */ +static int samsung_auto_clk_gate_en(struct clk_hw *hw) +{ + return 0; +} + +static void samsung_auto_clk_gate_dis(struct clk_hw *hw) +{ +} + +static const struct clk_ops samsung_auto_clk_gate_ops =3D { + .enable =3D samsung_auto_clk_gate_en, + .disable =3D samsung_auto_clk_gate_dis, + .is_enabled =3D samsung_auto_clk_gate_is_en, +}; + +struct clk_hw *samsung_register_auto_gate(struct device *dev, + struct device_node *np, const char *name, + const char *parent_name, const struct clk_hw *parent_hw, + const struct clk_parent_data *parent_data, + unsigned long flags, + void __iomem *reg, u8 bit_idx, + u8 clk_gate_flags, spinlock_t *lock) +{ + struct clk_gate *gate; + struct clk_hw *hw; + struct clk_init_data init =3D {}; + int ret =3D -EINVAL; + + /* allocate the gate */ + gate =3D kzalloc(sizeof(*gate), GFP_KERNEL); + if (!gate) + return ERR_PTR(-ENOMEM); + + init.name =3D name; + init.ops =3D &samsung_auto_clk_gate_ops; + init.flags =3D flags; + init.parent_names =3D parent_name ? &parent_name : NULL; + init.parent_hws =3D parent_hw ? &parent_hw : NULL; + init.parent_data =3D parent_data; + if (parent_name || parent_hw || parent_data) + init.num_parents =3D 1; + else + init.num_parents =3D 0; + + /* struct clk_gate assignments */ + gate->reg =3D reg; + gate->bit_idx =3D bit_idx; + gate->flags =3D clk_gate_flags; + gate->lock =3D lock; + gate->hw.init =3D &init; + + hw =3D &gate->hw; + if (dev || !np) + ret =3D clk_hw_register(dev, hw); + else if (np) + ret =3D of_clk_hw_register(np, hw); + if (ret) { + kfree(gate); + hw =3D ERR_PTR(ret); + } + + return hw; +} + /* register a list of gate clocks */ void __init samsung_clk_register_gate(struct samsung_clk_provider *ctx, const struct samsung_gate_clock *list, @@ -234,14 +343,24 @@ void __init samsung_clk_register_gate(struct samsung_= clk_provider *ctx, { struct clk_hw *clk_hw; unsigned int idx; + void __iomem *reg_offs; =20 for (idx =3D 0; idx < nr_clk; idx++, list++) { - clk_hw =3D clk_hw_register_gate(ctx->dev, list->name, list->parent_name, - list->flags, ctx->reg_base + list->offset, + reg_offs =3D ctx->reg_base + list->offset; + + if (ctx->auto_clock_gate && ctx->gate_dbg_offset) + clk_hw =3D samsung_register_auto_gate(ctx->dev, NULL, + list->name, list->parent_name, NULL, NULL, + list->flags, reg_offs + ctx->gate_dbg_offset, list->bit_idx, list->gate_flags, &ctx->lock); + else + clk_hw =3D clk_hw_register_gate(ctx->dev, list->name, + list->parent_name, list->flags, + ctx->reg_base + list->offset, list->bit_idx, + list->gate_flags, &ctx->lock); if (IS_ERR(clk_hw)) { - pr_err("%s: failed to register clock %s\n", __func__, - list->name); + pr_err("%s: failed to register clock %s: %ld\n", __func__, + list->name, PTR_ERR(clk_hw)); continue; } =20 @@ -276,10 +395,11 @@ static int samsung_clk_suspend(void) struct samsung_clock_reg_cache *reg_cache; =20 list_for_each_entry(reg_cache, &clock_reg_cache_list, node) { - samsung_clk_save(reg_cache->reg_base, reg_cache->rdump, - reg_cache->rd_num); - samsung_clk_restore(reg_cache->reg_base, reg_cache->rsuspend, - reg_cache->rsuspend_num); + samsung_clk_save(reg_cache->reg_base, reg_cache->sysreg, + reg_cache->rdump, reg_cache->rd_num); + samsung_clk_restore(reg_cache->reg_base, reg_cache->sysreg, + reg_cache->rsuspend, + reg_cache->rsuspend_num); } return 0; } @@ -289,8 +409,8 @@ static void samsung_clk_resume(void) struct samsung_clock_reg_cache *reg_cache; =20 list_for_each_entry(reg_cache, &clock_reg_cache_list, node) - samsung_clk_restore(reg_cache->reg_base, reg_cache->rdump, - reg_cache->rd_num); + samsung_clk_restore(reg_cache->reg_base, reg_cache->sysreg, + reg_cache->rdump, reg_cache->rd_num); } =20 static struct syscore_ops samsung_clk_syscore_ops =3D { @@ -299,6 +419,7 @@ static struct syscore_ops samsung_clk_syscore_ops =3D { }; =20 void samsung_clk_extended_sleep_init(void __iomem *reg_base, + struct regmap *sysreg, const unsigned long *rdump, unsigned long nr_rdump, const struct samsung_clk_reg_dump *rsuspend, @@ -319,6 +440,7 @@ void samsung_clk_extended_sleep_init(void __iomem *reg_= base, register_syscore_ops(&samsung_clk_syscore_ops); =20 reg_cache->reg_base =3D reg_base; + reg_cache->sysreg =3D sysreg; reg_cache->rd_num =3D nr_rdump; reg_cache->rsuspend =3D rsuspend; reg_cache->rsuspend_num =3D nr_rsuspend; @@ -330,10 +452,20 @@ void samsung_clk_extended_sleep_init(void __iomem *re= g_base, * samsung_cmu_register_clocks() - Register all clocks provided in CMU obj= ect * @ctx: Clock provider object * @cmu: CMU object with clocks to register + * @np: CMU device tree node */ void __init samsung_cmu_register_clocks(struct samsung_clk_provider *ctx, - const struct samsung_cmu_info *cmu) + const struct samsung_cmu_info *cmu, + struct device_node *np) { + if (samsung_is_auto_capable(np) && cmu->auto_clock_gate) + ctx->auto_clock_gate =3D cmu->auto_clock_gate; + + ctx->gate_dbg_offset =3D cmu->gate_dbg_offset; + ctx->option_offset =3D cmu->option_offset; + ctx->drcg_offset =3D cmu->drcg_offset; + ctx->memclk_offset =3D cmu->memclk_offset; + if (cmu->pll_clks) samsung_clk_register_pll(ctx, cmu->pll_clks, cmu->nr_pll_clks); if (cmu->mux_clks) @@ -353,6 +485,37 @@ void __init samsung_cmu_register_clocks(struct samsung= _clk_provider *ctx, samsung_clk_register_cpu(ctx, cmu->cpu_clks, cmu->nr_cpu_clks); } =20 +/* Each bit enable/disables DRCG of a bus component */ +#define DRCG_EN_MSK GENMASK(31, 0) +#define MEMCLK_EN BIT(0) + +/* Enable Dynamic Root Clock Gating (DRCG) of bus components */ +void samsung_en_dyn_root_clk_gating(struct device_node *np, + struct samsung_clk_provider *ctx, + const struct samsung_cmu_info *cmu) +{ + if (!ctx->auto_clock_gate) + return; + + ctx->sysreg =3D syscon_regmap_lookup_by_phandle(np, "samsung,sysreg"); + if (IS_ERR(ctx->sysreg)) { + pr_warn("%pOF: Unable to get CMU sysreg\n", np); + ctx->sysreg =3D NULL; + } else { + /* Enable DRCG for all bus components */ + regmap_write(ctx->sysreg, ctx->drcg_offset, DRCG_EN_MSK); + /* Enable memclk gate (not present on all sysreg) */ + if (ctx->memclk_offset) + regmap_write_bits(ctx->sysreg, ctx->memclk_offset, + MEMCLK_EN, 0x0); + + samsung_clk_extended_sleep_init(NULL, ctx->sysreg, + cmu->sysreg_clk_regs, + cmu->nr_sysreg_clk_regs, + NULL, 0); + } +} + /* * Common function which registers plls, muxes, dividers and gates * for each CMU. It also add CMU register list to register cache. @@ -371,14 +534,17 @@ struct samsung_clk_provider * __init samsung_cmu_regi= ster_one( } =20 ctx =3D samsung_clk_init(NULL, reg_base, cmu->nr_clk_ids); - samsung_cmu_register_clocks(ctx, cmu); + samsung_cmu_register_clocks(ctx, cmu, np); =20 if (cmu->clk_regs) - samsung_clk_extended_sleep_init(reg_base, + samsung_clk_extended_sleep_init(reg_base, NULL, cmu->clk_regs, cmu->nr_clk_regs, cmu->suspend_regs, cmu->nr_suspend_regs); =20 samsung_clk_of_add_provider(np, ctx); =20 + /* sysreg DT nodes reference a clock in this CMU */ + samsung_en_dyn_root_clk_gating(np, ctx, cmu); + return ctx; } diff --git a/drivers/clk/samsung/clk.h b/drivers/clk/samsung/clk.h index 18660c1ac6f0106b17b9efc9c6b3cd62d46f7b82..a56aa3be54d817cd24bf2bc2942= 7e783a1a9a859 100644 --- a/drivers/clk/samsung/clk.h +++ b/drivers/clk/samsung/clk.h @@ -12,6 +12,7 @@ =20 #include #include +#include #include "clk-pll.h" #include "clk-cpu.h" =20 @@ -19,13 +20,25 @@ * struct samsung_clk_provider - information about clock provider * @reg_base: virtual address for the register base * @dev: clock provider device needed for runtime PM + * @sysreg: syscon regmap for clock-provider sysreg controller * @lock: maintains exclusion between callbacks for a given clock-provider + * @auto_clock_gate: enable auto clk mode for all clocks in clock-provider + * @gate_dbg_offset: gate debug reg offset. Used for all gates in auto clk= mode + * @option_offset: option reg offset. Enables auto mode for clock-provider + * @drcg_offset: dynamic root clk gate enable register offset in sysreg + * @memclk_offset: memclk enable register offset in sysreg * @clk_data: holds clock related data like clk_hw* and number of clocks */ struct samsung_clk_provider { void __iomem *reg_base; struct device *dev; + struct regmap *sysreg; spinlock_t lock; + bool auto_clock_gate; + u32 gate_dbg_offset; + u32 option_offset; + u32 drcg_offset; + u32 memclk_offset; /* clk_data must be the last entry due to variable length 'hws' array */ struct clk_hw_onecell_data clk_data; }; @@ -310,6 +323,7 @@ struct samsung_cpu_clock { struct samsung_clock_reg_cache { struct list_head node; void __iomem *reg_base; + struct regmap *sysreg; struct samsung_clk_reg_dump *rdump; unsigned int rd_num; const struct samsung_clk_reg_dump *rsuspend; @@ -338,7 +352,14 @@ struct samsung_clock_reg_cache { * @suspend_regs: list of clock registers to set before suspend * @nr_suspend_regs: count of clock registers in @suspend_regs * @clk_name: name of the parent clock needed for CMU register access + * @sysreg_clk_regs: list of sysreg clock registers + * @nr_sysreg_clk_regs: count of clock registers in @sysreg_clk_regs * @manual_plls: Enable manual control for PLL clocks + * @auto_clock_gate: enable auto clock mode for all components in CMU + * @gate_dbg_offset: gate debug reg offset. Used by all gates in auto clk = mode + * @option_offset: option reg offset. Enables auto clk mode for entire CMU + * @drcg_offset: dynamic root clk gate enable register offset in sysreg + * @memclk_offset: memclk enable register offset in sysreg */ struct samsung_cmu_info { const struct samsung_pll_clock *pll_clks; @@ -364,8 +385,16 @@ struct samsung_cmu_info { unsigned int nr_suspend_regs; const char *clk_name; =20 + const unsigned long *sysreg_clk_regs; + unsigned int nr_sysreg_clk_regs; + /* ARM64 Exynos CMUs */ bool manual_plls; + bool auto_clock_gate; + u32 gate_dbg_offset; + u32 option_offset; + u32 drcg_offset; + u32 memclk_offset; }; =20 struct samsung_clk_provider *samsung_clk_init(struct device *dev, @@ -408,35 +437,55 @@ void samsung_clk_register_cpu(struct samsung_clk_prov= ider *ctx, const struct samsung_cpu_clock *list, unsigned int nr_clk); =20 void samsung_cmu_register_clocks(struct samsung_clk_provider *ctx, - const struct samsung_cmu_info *cmu); + const struct samsung_cmu_info *cmu, + struct device_node *np); struct samsung_clk_provider *samsung_cmu_register_one( struct device_node *, const struct samsung_cmu_info *); =20 #ifdef CONFIG_PM_SLEEP void samsung_clk_extended_sleep_init(void __iomem *reg_base, + struct regmap *sysreg, const unsigned long *rdump, unsigned long nr_rdump, const struct samsung_clk_reg_dump *rsuspend, unsigned long nr_rsuspend); #else static inline void samsung_clk_extended_sleep_init(void __iomem *reg_base, + struct regmap *sysreg, const unsigned long *rdump, unsigned long nr_rdump, const struct samsung_clk_reg_dump *rsuspend, unsigned long nr_rsuspend) {} #endif -#define samsung_clk_sleep_init(reg_base, rdump, nr_rdump) \ - samsung_clk_extended_sleep_init(reg_base, rdump, nr_rdump, NULL, 0) +#define samsung_clk_sleep_init(reg_base, sysreg, rdump, nr_rdump) \ + samsung_clk_extended_sleep_init(reg_base, sysreg, rdump, nr_rdump, \ + NULL, 0) =20 void samsung_clk_save(void __iomem *base, + struct regmap *regmap, struct samsung_clk_reg_dump *rd, unsigned int num_regs); void samsung_clk_restore(void __iomem *base, + struct regmap *regmap, const struct samsung_clk_reg_dump *rd, unsigned int num_regs); struct samsung_clk_reg_dump *samsung_clk_alloc_reg_dump( const unsigned long *rdump, unsigned long nr_rdump); =20 +void samsung_en_dyn_root_clk_gating(struct device_node *np, + struct samsung_clk_provider *ctx, + const struct samsung_cmu_info *cmu); + +struct clk_hw *samsung_register_auto_gate(struct device *dev, + struct device_node *np, const char *name, + const char *parent_name, const struct clk_hw *parent_hw, + const struct clk_parent_data *parent_data, + unsigned long flags, + void __iomem *reg, u8 bit_idx, + u8 clk_gate_flags, spinlock_t *lock); + +bool samsung_is_auto_capable(struct device_node *np); + #endif /* __SAMSUNG_CLK_H */ --=20 2.52.0.rc1.455.g30608eb744-goog From nobody Sun Dec 14 11:14:01 2025 Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C1C67326925 for ; Fri, 14 Nov 2025 14:17:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763129830; cv=none; b=ioD9B/BDwA5w0HU0p9/cDMPjzXc97phWV/bY7YyPgwa6Ye2O3A0HRiFEF6w9YyPZ7Y+hLfG3JvLZ5WgvtJOpZDdp3dkJNNFbcjTvtvzif8QfyHrWAwqzIKXRR/zZKKPF0YbangDeqxQAycEkCUpDR0aJGfdqcMfwrViZ5ILAvD4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763129830; c=relaxed/simple; bh=MKpewkNORbzAchE7rOq+25/zxxY9N/8QM3gYPecQu2A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Aw5ccsXM8KVCV+3AgxeVRYTOvZZ+Fk+vRjXHb5cDFpY02vfO0sNN4gJ4w5udkNpmXZMuBYwjOT+3E7GhitmZxAJJRBnOImv9WIVCGsZTqc2W65fb5fLM4BcuOV0qw6XoBTZj1LopvtQ9u96Ulq/bzT+jp9fLEYU6MPLyUeLxTTw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=ZQAARk+L; arc=none smtp.client-ip=209.85.221.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="ZQAARk+L" Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-42b427cda88so1492928f8f.0 for ; Fri, 14 Nov 2025 06:17:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1763129826; x=1763734626; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=izrTMD0huWeNRknL/GAHd/+r7uT+qo4tnd5Axn/4bzo=; b=ZQAARk+L8r2QWoNIGy4x6c806Qak/afdbwsAVRt7Idx6ubN6YUqqKKN6M2d/adwx/I 2wtmu0jkNwwqA9sThzVS14XhlgUHIrxoSRISbIhO59JUjImUsigoyXko3nruo7n3/iaF LV2AX3Ojovkq4RCviuAzEXX39pGEkMvZyHL4AXXjE+AxdnrSopbM0XeF3/xDPk5aIFcP +wdSkrUAkJYtGGhw2YIzol1IT2be25zQ+OVgrV8wqR//sSRHGIAc/U6WB49OTpPv6yUy YBpBn/jHZ43F2Z7eI1pcoJUKoarJ8CjQiD/DhaklxbnpBaofvKm33IV6L4HQ3+Q4RACL dhIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763129826; x=1763734626; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=izrTMD0huWeNRknL/GAHd/+r7uT+qo4tnd5Axn/4bzo=; b=cTG0QbM6aFLG/o1mwRVPAZGZWTIMti1LPHtPFkcCcba44drVw8rfWv0SxaIClCTwFB lBmR2w9/bAKvNvlA5GiGu0TnaJJuP4QcCAyfYxKIogMQ1IB5oco06FpHpnOFid5gRffB KtlKYUuRAYQqDOtvz4Zum8tkmr5Oj5PbihRSZR6T2nFj0dUf5jSGGcc8dmUQdEuzY6z0 e1JyhtQZuJ56Lb/LTs6U2v9p+iAd/sI59PDSt2jQ1tM7KzsEwHkxYJ2yaN6y8zFNFuNI h39xfbPcYMMO/CUC4wm7ex3VPivJ2u6Nao10N4qrzF2p8jGxF7lai3qPEl+i7L9llIEs EPJw== X-Forwarded-Encrypted: i=1; AJvYcCVSbqRu7FhLxTXQxLBb37sPHtiANxfV6JUVkibrV8NERaU8fykApnDmC3s9STlxCxkuQ4L+avnMzQ2AJbo=@vger.kernel.org X-Gm-Message-State: AOJu0YwyFNL1+hDarSj1hAlpCD8cXlT24uxscQfcvp5IkFbNy/Lt6X+L woONV/8JXAXuZSF3vheSBxb4kN/uX1BV6U64Zoi3TshgbvnGAObKFv4HIFIh5eDHxT0= X-Gm-Gg: ASbGncsm28zo+f+aadfBeig/H/upu3kOwfbMBXQ6Rq39JdW9LfZMlwHeQ3CeTal7DLt qbzZY4/egrIRDYwVHEqhpNT5vDKvevMH8sQKVa4LO5l8I5PWWfYJRQlwbHd40QZfcUrxg8c/Hbf D0XomUz7hm6xe6FqFgQT1QnRqkklsJx0YPMnpcBA3Em39wmGeDuHtTFQ9wXN+32NWDLSXQBqAc7 UnCDHatq0WUDU1Snks8v+XK2zOTajuEjvjNpdJSYDbOSdT/9u4XEB1XiuAgf4QsxoGqM6VocdEm IlrI5o4ZO5jhPj1rzp6qmQUmD9xVvJ2hPrzL/79TmTWgr0eSZZKlrS4kXTJqi2//UJpHUnIvc3g oGZHcrmKdgUya09Jzr+Kum5pNo2tAuu7sYseUcNJxSsKoIHWK+F9JlFB2sYo0wh498dXNDDhAeC GTHdSqUQhdKAhcgv7A7AMiKLEPucMVBQ== X-Google-Smtp-Source: AGHT+IH96TxZeOefX8+SY8uloxCFq2LKDEjHOXQ7zqlH0Jw8f3vwrEecayPgVM4Hu/FkPGbODo1b8g== X-Received: by 2002:a05:6000:2509:b0:42b:4803:75e8 with SMTP id ffacd0b85a97d-42b5937335fmr2978794f8f.43.1763129825971; Fri, 14 Nov 2025 06:17:05 -0800 (PST) Received: from gpeter-l.roam.corp.google.com ([145.224.65.83]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-42b53f21948sm10150958f8f.43.2025.11.14.06.17.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Nov 2025 06:17:05 -0800 (PST) From: Peter Griffin Date: Fri, 14 Nov 2025 14:16:51 +0000 Subject: [PATCH v5 4/4] clk: samsung: gs101: Enable auto_clock_gate mode for each gs101 CMU 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: <20251114-automatic-clocks-v5-4-efb9202ffcd7@linaro.org> References: <20251114-automatic-clocks-v5-0-efb9202ffcd7@linaro.org> In-Reply-To: <20251114-automatic-clocks-v5-0-efb9202ffcd7@linaro.org> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alim Akhtar , =?utf-8?q?Andr=C3=A9_Draszik?= , Tudor Ambarus , Michael Turquette , Stephen Boyd , Sam Protsenko , Sylwester Nawrocki , Chanwoo Choi Cc: Will McVicker , Krzysztof Kozlowski , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, kernel-team@android.com, Peter Griffin , Krzysztof Kozlowski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6082; i=peter.griffin@linaro.org; h=from:subject:message-id; bh=MKpewkNORbzAchE7rOq+25/zxxY9N/8QM3gYPecQu2A=; b=owEBbQKS/ZANAwAKAc7ouNYCNHK6AcsmYgBpFznZjRn7B08lXbfeHCgvZruDuguZEiCYDtEZS G6Sh7bBJoGJAjMEAAEKAB0WIQQO/I5vVXh1DVa1SfzO6LjWAjRyugUCaRc52QAKCRDO6LjWAjRy utPTD/4p8UJafm5z3n3XNt0BjCf+MReD7ndnIAJlkxzL9tG0v7gAUB8VT7IHK+rdTOuHBtKT0RQ SI1kX0hDDlVkGwi6OLZHK7tjqtyzdMy4Xo23R1MmHvl3NPOx9rytFuMEJrOEdxDstjbq6eqA9y/ bgt8VkED8iWLgDGTb1ONPkhhyXTiomMYxJItr9G8GU7PChZOGwcuMqww3xu88CFWId0O9xK5aif +Ns6ID7pcOeSU8upN564uKZRBeQOEskxWnZuf2ucuMnD41DP17B/vBcKJqJhBs4L2BkalLGDKPk /dN9k3u+YxK3dYPq1u1I01D9FAbYYv3rE3zy8U4Dume5HlFZULcooAAUwYsYM9Q8reX4EtnW9Sm PijR3oY6A6VYn2/HzbVPuoagtV0WWAYMtdHkQ+2jxYJei9CvqVZZI4b6hZ595CtZUngeA3WY6vp RNm+saZuAbHfsd6W0OIrdErK6hxh8c0Ziwt9o0kXSU5QV/ggB9dHe5+lQyTIW+XLzaHrwrnkgDt fQfKd1lBICfMNTqUbR7rq9UEkjAR20tip3tWMmhUJQ3NdnUQsR8r1cc6vX+bI5vnYDbhYsW1kh4 ggAJJRfQpoCGUwXXE2DzWytdrvE+JUKtRlfYlTtnSHtrCYIDFdEn2X46xUwWbqA14CvAfbIAd1s DcDh9yE70fsUFvA== X-Developer-Key: i=peter.griffin@linaro.org; a=openpgp; fpr=0EFC8E6F5578750D56B549FCCEE8B8D6023472BA Enable auto clock mode, and define the additional fields which are used when this mode is enabled. /sys/kernel/debug/clk/clk_summary now reports approximately 308 running clocks and 298 disabled clocks. Prior to this commit 586 clocks were running and 17 disabled. Signed-off-by: Peter Griffin --- Changes in v4: - Remove unnecessary header of_address.h (Peter) --- drivers/clk/samsung/clk-gs101.c | 55 +++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 55 insertions(+) diff --git a/drivers/clk/samsung/clk-gs101.c b/drivers/clk/samsung/clk-gs10= 1.c index 70b26db9b95ad0b376d23f637c7683fbc8c8c600..8551289b46eb88ec61dd1914d0f= e782ae6794000 100644 --- a/drivers/clk/samsung/clk-gs101.c +++ b/drivers/clk/samsung/clk-gs101.c @@ -26,6 +26,10 @@ #define CLKS_NR_PERIC0 (CLK_GOUT_PERIC0_SYSREG_PERIC0_PCLK + 1) #define CLKS_NR_PERIC1 (CLK_GOUT_PERIC1_SYSREG_PERIC1_PCLK + 1) =20 +#define GS101_GATE_DBG_OFFSET 0x4000 +#define GS101_DRCG_EN_OFFSET 0x104 +#define GS101_MEMCLK_OFFSET 0x108 + /* ---- CMU_TOP ----------------------------------------------------------= --- */ =20 /* Register Offset definitions for CMU_TOP (0x1e080000) */ @@ -1433,6 +1437,9 @@ static const struct samsung_cmu_info top_cmu_info __i= nitconst =3D { .nr_clk_ids =3D CLKS_NR_TOP, .clk_regs =3D cmu_top_clk_regs, .nr_clk_regs =3D ARRAY_SIZE(cmu_top_clk_regs), + .auto_clock_gate =3D true, + .gate_dbg_offset =3D GS101_GATE_DBG_OFFSET, + .option_offset =3D CMU_CMU_TOP_CONTROLLER_OPTION, }; =20 static void __init gs101_cmu_top_init(struct device_node *np) @@ -1900,6 +1907,11 @@ static const struct samsung_gate_clock apm_gate_clks= [] __initconst =3D { CLK_CON_GAT_GOUT_BLK_APM_UID_XIU_DP_APM_IPCLKPORT_ACLK, 21, CLK_IS_C= RITICAL, 0), }; =20 +static const unsigned long dcrg_memclk_sysreg[] __initconst =3D { + GS101_DRCG_EN_OFFSET, + GS101_MEMCLK_OFFSET, +}; + static const struct samsung_cmu_info apm_cmu_info __initconst =3D { .mux_clks =3D apm_mux_clks, .nr_mux_clks =3D ARRAY_SIZE(apm_mux_clks), @@ -1912,6 +1924,12 @@ static const struct samsung_cmu_info apm_cmu_info __= initconst =3D { .nr_clk_ids =3D CLKS_NR_APM, .clk_regs =3D apm_clk_regs, .nr_clk_regs =3D ARRAY_SIZE(apm_clk_regs), + .sysreg_clk_regs =3D dcrg_memclk_sysreg, + .nr_sysreg_clk_regs =3D ARRAY_SIZE(dcrg_memclk_sysreg), + .auto_clock_gate =3D true, + .gate_dbg_offset =3D GS101_GATE_DBG_OFFSET, + .drcg_offset =3D GS101_DRCG_EN_OFFSET, + .memclk_offset =3D GS101_MEMCLK_OFFSET, }; =20 /* ---- CMU_HSI0 ---------------------------------------------------------= --- */ @@ -2375,7 +2393,14 @@ static const struct samsung_cmu_info hsi0_cmu_info _= _initconst =3D { .nr_clk_ids =3D CLKS_NR_HSI0, .clk_regs =3D hsi0_clk_regs, .nr_clk_regs =3D ARRAY_SIZE(hsi0_clk_regs), + .sysreg_clk_regs =3D dcrg_memclk_sysreg, + .nr_sysreg_clk_regs =3D ARRAY_SIZE(dcrg_memclk_sysreg), .clk_name =3D "bus", + .auto_clock_gate =3D true, + .gate_dbg_offset =3D GS101_GATE_DBG_OFFSET, + .option_offset =3D HSI0_CMU_HSI0_CONTROLLER_OPTION, + .drcg_offset =3D GS101_DRCG_EN_OFFSET, + .memclk_offset =3D GS101_MEMCLK_OFFSET, }; =20 /* ---- CMU_HSI2 ---------------------------------------------------------= --- */ @@ -2863,7 +2888,14 @@ static const struct samsung_cmu_info hsi2_cmu_info _= _initconst =3D { .nr_clk_ids =3D CLKS_NR_HSI2, .clk_regs =3D cmu_hsi2_clk_regs, .nr_clk_regs =3D ARRAY_SIZE(cmu_hsi2_clk_regs), + .sysreg_clk_regs =3D dcrg_memclk_sysreg, + .nr_sysreg_clk_regs =3D ARRAY_SIZE(dcrg_memclk_sysreg), .clk_name =3D "bus", + .auto_clock_gate =3D true, + .gate_dbg_offset =3D GS101_GATE_DBG_OFFSET, + .option_offset =3D HSI2_CMU_HSI2_CONTROLLER_OPTION, + .drcg_offset =3D GS101_DRCG_EN_OFFSET, + .memclk_offset =3D GS101_MEMCLK_OFFSET, }; =20 /* ---- CMU_MISC ---------------------------------------------------------= --- */ @@ -3423,7 +3455,14 @@ static const struct samsung_cmu_info misc_cmu_info _= _initconst =3D { .nr_clk_ids =3D CLKS_NR_MISC, .clk_regs =3D misc_clk_regs, .nr_clk_regs =3D ARRAY_SIZE(misc_clk_regs), + .sysreg_clk_regs =3D dcrg_memclk_sysreg, + .nr_sysreg_clk_regs =3D ARRAY_SIZE(dcrg_memclk_sysreg), .clk_name =3D "bus", + .auto_clock_gate =3D true, + .gate_dbg_offset =3D GS101_GATE_DBG_OFFSET, + .option_offset =3D MISC_CMU_MISC_CONTROLLER_OPTION, + .drcg_offset =3D GS101_DRCG_EN_OFFSET, + .memclk_offset =3D GS101_MEMCLK_OFFSET, }; =20 static void __init gs101_cmu_misc_init(struct device_node *np) @@ -4010,6 +4049,10 @@ static const struct samsung_gate_clock peric0_gate_c= lks[] __initconst =3D { 21, 0, 0), }; =20 +static const unsigned long dcrg_sysreg[] __initconst =3D { + GS101_DRCG_EN_OFFSET, +}; + static const struct samsung_cmu_info peric0_cmu_info __initconst =3D { .mux_clks =3D peric0_mux_clks, .nr_mux_clks =3D ARRAY_SIZE(peric0_mux_clks), @@ -4020,7 +4063,13 @@ static const struct samsung_cmu_info peric0_cmu_info= __initconst =3D { .nr_clk_ids =3D CLKS_NR_PERIC0, .clk_regs =3D peric0_clk_regs, .nr_clk_regs =3D ARRAY_SIZE(peric0_clk_regs), + .sysreg_clk_regs =3D dcrg_sysreg, + .nr_sysreg_clk_regs =3D ARRAY_SIZE(dcrg_sysreg), .clk_name =3D "bus", + .auto_clock_gate =3D true, + .gate_dbg_offset =3D GS101_GATE_DBG_OFFSET, + .option_offset =3D PERIC0_CMU_PERIC0_CONTROLLER_OPTION, + .drcg_offset =3D GS101_DRCG_EN_OFFSET, }; =20 /* ---- CMU_PERIC1 -------------------------------------------------------= --- */ @@ -4368,7 +4417,13 @@ static const struct samsung_cmu_info peric1_cmu_info= __initconst =3D { .nr_clk_ids =3D CLKS_NR_PERIC1, .clk_regs =3D peric1_clk_regs, .nr_clk_regs =3D ARRAY_SIZE(peric1_clk_regs), + .sysreg_clk_regs =3D dcrg_sysreg, + .nr_sysreg_clk_regs =3D ARRAY_SIZE(dcrg_sysreg), .clk_name =3D "bus", + .auto_clock_gate =3D true, + .gate_dbg_offset =3D GS101_GATE_DBG_OFFSET, + .option_offset =3D PERIC1_CMU_PERIC1_CONTROLLER_OPTION, + .drcg_offset =3D GS101_DRCG_EN_OFFSET, }; =20 /* ---- platform_driver --------------------------------------------------= --- */ --=20 2.52.0.rc1.455.g30608eb744-goog