From nobody Thu Oct 2 05:03:19 2025 Received: from sender4-op-o16.zoho.com (sender4-op-o16.zoho.com [136.143.188.16]) (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 9F5BC2D29AA; Mon, 22 Sep 2025 14:54:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758552892; cv=pass; b=RAstOt0VM8XMb9pSbJ4CQ8bxvTUFUiSsHRurgwf60WkOiDoZ9l/6J8ROStd9PPv7fjM/yGCgTyxMq4wiHq+1EPHe2AiijvkxSDzl6G4HGYN/V13aeHS04zz9Lr9wAtEVYn/pu+66M7u1Ixajez6c994Dd1edO13/idt4gR9Sv+U= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758552892; c=relaxed/simple; bh=QTzyuKcq78b1rHf4U4+Ek5P0fIK1pBd2tg1GAgtsSh4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WhzXDBv9YNhelfS6p013J8doxMG4xWOXh7LJhWRrK4GoKoQyyQVnZW8vTUVMxrSLFuBmwVW7TdI9DX89BctIVSLvr4tUWpvKJsKLLJQ1nA2nLn/qe94NKL0oZtP1LCVR1E06ufyhyredmFYV1n7yPAKdsez190erkAT+2J40dUI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pigmoral.tech; spf=pass smtp.mailfrom=pigmoral.tech; dkim=pass (1024-bit key) header.d=pigmoral.tech header.i=junhui.liu@pigmoral.tech header.b=SIm6yQ9+; arc=pass smtp.client-ip=136.143.188.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pigmoral.tech Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pigmoral.tech Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=pigmoral.tech header.i=junhui.liu@pigmoral.tech header.b="SIm6yQ9+" ARC-Seal: i=1; a=rsa-sha256; t=1758552868; cv=none; d=zohomail.com; s=zohoarc; b=RN45ZZ4SGRe5sVd7IraZ6S8tyQq6AraGsKpx8uCJ3ZiXShgEZjQHgTbpgVCHCBgHP+t42nZ5HCCX83vLuOf3cKd3v/GkgYmjG7aL5PDske8cGdesWrtiReAkwxLataJ8nlwTVZpQXFXhfEMNUv8Os0Ovm5K4NnUFKnfSMtM/a2A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1758552868; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=g5ht2Ynuy4olVC7AOTttqtZQ3VZCttE+E0h1vADll6c=; b=jI7/1QD/ayp2NBJkG6G7e9UaJ8lacuYLurWhaP7Q2ncxI6PWk6WG8IDNsZKHW0+GnOC1lGF5PFLjjs/nPYCRAaJyjPKwIMso5YZiJGDIM2f7yBfxxLbN867mHYWBxRrxauUm88FvqhgMub15ZHekB1K2AZs/nfSaV9KpyCNOGbw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=pigmoral.tech; spf=pass smtp.mailfrom=junhui.liu@pigmoral.tech; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1758552868; s=zmail; d=pigmoral.tech; i=junhui.liu@pigmoral.tech; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=g5ht2Ynuy4olVC7AOTttqtZQ3VZCttE+E0h1vADll6c=; b=SIm6yQ9+ClUeq3mVjJ5Q/4P4s0j+YNAHR9XwtaiC8f82d68HsXuoCxqDS1CsoRS8 /rF7kw0VGrd9OjFl+yBAm8a9qV1kVaCBwo84fASgYucrO/qvhwr1N5Am4r9MRBGVZxf GL1YeseEQB+ssIf9f5tAY1uUEmx/YUnEbUNEUb+c= Received: by mx.zohomail.com with SMTPS id 1758552867183905.6994838386554; Mon, 22 Sep 2025 07:54:27 -0700 (PDT) From: Junhui Liu Date: Mon, 22 Sep 2025 22:51:47 +0800 Subject: [PATCH 1/5] clk: correct clk_div_mask() return value for width == 32 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: <20250922-dr1v90-cru-v1-1-e393d758de4e@pigmoral.tech> References: <20250922-dr1v90-cru-v1-0-e393d758de4e@pigmoral.tech> In-Reply-To: <20250922-dr1v90-cru-v1-0-e393d758de4e@pigmoral.tech> To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Junhui Liu , Philipp Zabel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, "fushan.zeng" X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1758552834; l=1200; i=junhui.liu@pigmoral.tech; s=20250910; h=from:subject:message-id; bh=QTzyuKcq78b1rHf4U4+Ek5P0fIK1pBd2tg1GAgtsSh4=; b=1ttbEuj65evPw6Elmvdyk7dxGu6wEYUJfmGmo4S/ZNhG5vHJThOFDEMqkdCipXqGi+Pjh9RFX 7GuI6Ihokj1AptRvH/sj+RLrmINE7j2B2rV6BC1Rjp8spSV9puPYzN6 X-Developer-Key: i=junhui.liu@pigmoral.tech; a=ed25519; pk=cgATWSU1KfGWmdwNmkPyHGnWgofhqqhE8Vts58wyxe4= X-ZohoMailClient: External The macro clk_div_mask() currently wraps to zero when width is 32 due to 1 << 32 being undefined behavior. This leads to incorrect mask generation and prevents correct retrieval of register field values for 32-bit-wide dividers. Although it is unlikely to exhaust all U32_MAX div, some clock IPs may rely on a 32-bit val entry in their div_table to match a div, so providing a full 32-bit mask is necessary. Fix this by casting 1 to long, ensuring proper behavior for valid widths up to 32. Signed-off-by: Junhui Liu Reviewed-by: Troy Mitchell --- include/linux/clk-provider.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index 630705a47129453c241f1b1755f2c2f2a7ed8f77..a651ccaf1b44ff905c2bd4b9a70= 43f9e2169d27f 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -720,7 +720,7 @@ struct clk_divider { spinlock_t *lock; }; =20 -#define clk_div_mask(width) ((1 << (width)) - 1) +#define clk_div_mask(width) ((1L << (width)) - 1) #define to_clk_divider(_hw) container_of(_hw, struct clk_divider, hw) =20 #define CLK_DIVIDER_ONE_BASED BIT(0) --=20 2.51.0 From nobody Thu Oct 2 05:03:19 2025 Received: from sender4-op-o16.zoho.com (sender4-op-o16.zoho.com [136.143.188.16]) (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 C27522D248B; Mon, 22 Sep 2025 14:55:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758552911; cv=pass; b=kLVUKoiuJPc2YtW3YGsVuEcG0aQUOaU0E3h1Gg2z9SJYPtOxd7b0s7BNlH0R/B02yan1s5dgmcdsCXbs/rmh5nCs5aOkfttResbYyUGII/T6K3Z2mRvaSksqgNOI16mTowNf6hERxnr4Up8c8EsKGrmlLtwqGv4Ga0FBbKeXYMw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758552911; c=relaxed/simple; bh=Dp1B+m+lazPgrf8IPyyBCe9O9i8M/wMMQ5M8r7le1Mw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=I+n3ffDIiI/88krd+XJ2kB3IjiUFE6fTZEJ7NKR8WqSM29pJHx3rXz4hkBPdtdDXOQFTWP1+EQPKbM98Qfmtn820RBEQ3AYqZEWqpBPuxTbyvqtQNREEgDJxXd9nCxAPxFC7XewhQYVVRuUqlhOKSFgpociMtF5EaDJRFkUfLF4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pigmoral.tech; spf=pass smtp.mailfrom=pigmoral.tech; dkim=pass (1024-bit key) header.d=pigmoral.tech header.i=junhui.liu@pigmoral.tech header.b=X8Hw3Q1T; arc=pass smtp.client-ip=136.143.188.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pigmoral.tech Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pigmoral.tech Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=pigmoral.tech header.i=junhui.liu@pigmoral.tech header.b="X8Hw3Q1T" ARC-Seal: i=1; a=rsa-sha256; t=1758552882; cv=none; d=zohomail.com; s=zohoarc; b=GY2BiSvhaKqVlNQ3jLPDd+IMx/w/ZKhV3qbenOZS6nP+iqbQFb67iEAd3LsCERMFlPhHlAhPk3QPIPvOTFoj0EejV5X4LEtUXcGDWAV2IyM+wnz1aL61ScBUIGzwb8rD8CABe56x7t9yRc2+yi0qZQew8ccoLsEJmZMUHwT338Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1758552882; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=VKAHYHQMSU3Sazt3AzibRdtYJHKKbmTRN1QCcYVHYRg=; b=LzyI/U6y04XktJNrT9K8sr8Heq3geCEzi+JWT6vUT6V8/JADJHkx9+Qm2eomOyGnYnveOynhGsTBOwtn5Sc6z38/dmp/ClMQy1dJEW/tLGAJhvh4xWas8t8ikRUr5vVai2PTa4ctRC6Y57OyEYHUEWoe4PIpLGZ4wIVleFdbZr8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=pigmoral.tech; spf=pass smtp.mailfrom=junhui.liu@pigmoral.tech; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1758552882; s=zmail; d=pigmoral.tech; i=junhui.liu@pigmoral.tech; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=VKAHYHQMSU3Sazt3AzibRdtYJHKKbmTRN1QCcYVHYRg=; b=X8Hw3Q1TO6keUhI17SZibDj7sJClvzVKBkqdyLyxttgpEydQaHfhsKZleR3kQBMx xba88WGZLAjBP1rLiajBcKGfLdDpVhCFreUzp+ldq7In1ZshwkT39FBds8AbzZzu40d 91+RaON4Qb9lqlOD1+MB2SobsSbvmqGehn/ZpDCc= Received: by mx.zohomail.com with SMTPS id 1758552879739807.5979493071006; Mon, 22 Sep 2025 07:54:39 -0700 (PDT) From: Junhui Liu Date: Mon, 22 Sep 2025 22:51:48 +0800 Subject: [PATCH 2/5] dt-bindings: clock: add Anlogic DR1V90 CRU 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: <20250922-dr1v90-cru-v1-2-e393d758de4e@pigmoral.tech> References: <20250922-dr1v90-cru-v1-0-e393d758de4e@pigmoral.tech> In-Reply-To: <20250922-dr1v90-cru-v1-0-e393d758de4e@pigmoral.tech> To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Junhui Liu , Philipp Zabel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, "fushan.zeng" X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1758552834; l=5255; i=junhui.liu@pigmoral.tech; s=20250910; h=from:subject:message-id; bh=Dp1B+m+lazPgrf8IPyyBCe9O9i8M/wMMQ5M8r7le1Mw=; b=CAUGt0jn0WMDpJ2kFNML0ocqb5dl55H6C68VpohHlIJmycRAo9YzU6YxTynTYMvp59dHiZr6n 3l4265Ru5V1DCNRGm4xiZmibiOqEZ55rbIpBpGyjJxPn5kQl0HR9HD+ X-Developer-Key: i=junhui.liu@pigmoral.tech; a=ed25519; pk=cgATWSU1KfGWmdwNmkPyHGnWgofhqqhE8Vts58wyxe4= X-ZohoMailClient: External Add the Clock and Reset Unit (CRU) support for the Anlogic DR1V90 SoC, which is responsible for clock and reset management. Signed-off-by: Junhui Liu Reviewed-by: Conor Dooley --- .../bindings/clock/anlogic,dr1v90-cru.yaml | 60 ++++++++++++++++++= ++++ include/dt-bindings/clock/anlogic,dr1v90-cru.h | 46 +++++++++++++++++ include/dt-bindings/reset/anlogic,dr1v90-cru.h | 42 +++++++++++++++ 3 files changed, 148 insertions(+) diff --git a/Documentation/devicetree/bindings/clock/anlogic,dr1v90-cru.yam= l b/Documentation/devicetree/bindings/clock/anlogic,dr1v90-cru.yaml new file mode 100644 index 0000000000000000000000000000000000000000..165c71ce333a8ee8ebbc86f238b= b807880580aca --- /dev/null +++ b/Documentation/devicetree/bindings/clock/anlogic,dr1v90-cru.yaml @@ -0,0 +1,60 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/clock/anlogic,dr1v90-cru.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Anlogic DR1V90 Clock and Reset Unit (CRU) + +maintainers: + - Junhui Liu + +properties: + compatible: + const: anlogic,dr1v90-cru + + reg: + maxItems: 1 + + clocks: + items: + - description: Main Oscillator (33 MHz) + - description: External CAN clock + - description: External WDT clock + + clock-names: + items: + - const: osc_33m + - const: can_ext + - const: wdt_ext + + "#clock-cells": + const: 1 + description: + Refer for valid indices. + + "#reset-cells": + const: 1 + description: + Refer for valid indices. + +required: + - compatible + - reg + - clocks + - clock-names + - "#clock-cells" + - "#reset-cells" + +additionalProperties: false + +examples: + - | + clock-controller@f8801000 { + compatible =3D "anlogic,dr1v90-cru"; + reg =3D <0xf8801000 0x400>; + clocks =3D <&osc_33m>, <&can_ext>, <&wdt_ext>; + clock-names =3D "osc_33m", "can_ext", "wdt_ext"; + #clock-cells =3D <1>; + #reset-cells =3D <1>; + }; diff --git a/include/dt-bindings/clock/anlogic,dr1v90-cru.h b/include/dt-bi= ndings/clock/anlogic,dr1v90-cru.h new file mode 100644 index 0000000000000000000000000000000000000000..d87dd7ef4510b5bb2f7f892f5a1= 4aa6d29456767 --- /dev/null +++ b/include/dt-bindings/clock/anlogic,dr1v90-cru.h @@ -0,0 +1,46 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +/* + * Copyright (c) 2025 Shanghai Anlogic Infotech Co., Ltd. + * Copyright (c) 2025 Junhui Liu + */ + +#ifndef _DT_BINDINGS_CLOCK_ANLOGIC_DR1V90_CRU_H_ +#define _DT_BINDINGS_CLOCK_ANLOGIC_DR1V90_CRU_H_ + +#define CLK_OSC_DIV2 0 +#define CLK_CPU_PLL 1 +#define CLK_CPU_PLL_4X 2 +#define CLK_CPU_4X 3 +#define CLK_CPU_2X 4 +#define CLK_CPU_1X 5 +#define CLK_IO_PLL 6 +#define CLK_IO_1000M 7 +#define CLK_IO_400M 8 +#define CLK_IO_25M 9 +#define CLK_IO_80M 10 +#define CLK_IO_400M_DIV2 11 +#define CLK_IO_400M_DIV4 12 +#define CLK_IO_400M_DIV8 13 +#define CLK_IO_400M_DIV16 14 +#define CLK_QSPI 15 +#define CLK_SPI 16 +#define CLK_SMC 17 +#define CLK_SDIO 18 +#define CLK_GPIO_DB 19 +#define CLK_EFUSE 20 +#define CLK_TVS 21 +#define CLK_TRNG 22 +#define CLK_OSC_DIV 23 +#define CLK_PWM 24 +#define CLK_FCLK0 25 +#define CLK_FCLK1 26 +#define CLK_FCLK2 27 +#define CLK_FCLK3 28 +#define CLK_WDT_SEL 29 +#define CLK_EFUSE_SEL 30 +#define CLK_CAN_SEL 31 +#define CLK_CPU_SEL 32 +#define CLK_CAN0 33 +#define CLK_CAN1 34 + +#endif /* _DT_BINDINGS_CLOCK_ANLOGIC_DR1V90_CRU_H_ */ diff --git a/include/dt-bindings/reset/anlogic,dr1v90-cru.h b/include/dt-bi= ndings/reset/anlogic,dr1v90-cru.h new file mode 100644 index 0000000000000000000000000000000000000000..0eed06f417e01a2dbc5074b9c73= 1d24eff050117 --- /dev/null +++ b/include/dt-bindings/reset/anlogic,dr1v90-cru.h @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +/* + * Copyright (c) 2025 Shanghai Anlogic Infotech Co., Ltd. + * Copyright (c) 2025 Junhui Liu + */ + +#ifndef _DT_BINDINGS_RESET_ANLOGIC_DR1V90_CRU_H_ +#define _DT_BINDINGS_RESET_ANLOGIC_DR1V90_CRU_H_ + +#define RESET_OCM 0 +#define RESET_QSPI 1 +#define RESET_SMC 2 +#define RESET_WDT 3 +#define RESET_DMAC_AXI 4 +#define RESET_DMAC_AHB 5 +#define RESET_NPU 6 +#define RESET_JPU 7 +#define RESET_DDRBUS 8 +#define RESET_NIC_HP0 9 +#define RESET_NIC_HP1 10 +#define RESET_NIC_GP0M 11 +#define RESET_NIC_GP1M 12 +#define RESET_GPIO 13 +#define RESET_IPC 14 +#define RESET_USB0 15 +#define RESET_USB1 16 +#define RESET_GBE0 17 +#define RESET_GBE1 18 +#define RESET_SDIO0 19 +#define RESET_SDIO1 20 +#define RESET_UART0 21 +#define RESET_UART1 22 +#define RESET_SPI0 23 +#define RESET_SPI1 24 +#define RESET_CAN0 25 +#define RESET_CAN1 26 +#define RESET_TTC0 27 +#define RESET_TTC1 28 +#define RESET_I2C0 29 +#define RESET_I2C1 30 + +#endif /* _DT_BINDINGS_RESET_ANLOGIC_DR1V90_CRU_H_ */ --=20 2.51.0 From nobody Thu Oct 2 05:03:19 2025 Received: from sender4-op-o16.zoho.com (sender4-op-o16.zoho.com [136.143.188.16]) (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 02332BE49; Mon, 22 Sep 2025 14:55:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758552921; cv=pass; b=sYL6CmyR/VeuDCby7vcKelknZIaXhCwfWrJV7WPrGsdJMjWDlOHbbNtgmN1o27mU33u3HR5n3Hqrw6Rhcw1gKuh6lXOi6TiKbPaZmB8O3928WwAylCixP8XX2I7Gegu77Pn/hQOfpQIhPcEfFSj53dkdiFb7pxN/7FOkTtZPosU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758552921; c=relaxed/simple; bh=WFluuIf1SDJRVTTtlOH4QZu9CbhyX9v+Jdb36gXJQRw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SaGThnp7xpi/LX0WwidkNJHZpAsH2i5TBM3XBIkJanDL2z7fuFqxpkegf14i55GSdlyFsP+tltvgDGN6hXbYRKMi7eXG6uJpE2dbQZ7cdKBILA2Mu887kLorNVy3+eaN9OESr9D4RjZKMZ0yuAHK/cFOhvuPllG5JJUHjM4kDOo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pigmoral.tech; spf=pass smtp.mailfrom=pigmoral.tech; dkim=pass (1024-bit key) header.d=pigmoral.tech header.i=junhui.liu@pigmoral.tech header.b=G9hKiqHZ; arc=pass smtp.client-ip=136.143.188.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pigmoral.tech Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pigmoral.tech Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=pigmoral.tech header.i=junhui.liu@pigmoral.tech header.b="G9hKiqHZ" ARC-Seal: i=1; a=rsa-sha256; t=1758552896; cv=none; d=zohomail.com; s=zohoarc; b=OcpokqqCxOIiaDV13z0t/lf/HWuLUPBIdbDS2p4rk8xSXNo8blTp9UujF2FtzqdPqv3D1Dk6n23IYLBxEy+V5t896Nh6EP0VD2EQaiVm9rzoAfL9w+SMxIXDVpwXgAMGzOdBU03CFUh6O+rBP1DS6F7Uan3RGQ+RNRC0xZGN6NI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1758552896; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=mLp3ZMo/giWVFh9OCiJLFBIPuGvtpgKq2hcTvkWk2Jo=; b=MK/Kk+r6lw8iqgyNZK2F6neVzo8tr/HBEgpgAIxZdY8D4YFE+yggm+xD4Xj69o/E5dyJPI1CZ+wzIg71YBSOROL4NW0G7vrE2nr4tG3eGhUVMdQHIpYp4r9POjvl4WxcRkNd9ThEmy2PDK2GUx1BIvUz7RDVHVrDEqUQgzr/HPM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=pigmoral.tech; spf=pass smtp.mailfrom=junhui.liu@pigmoral.tech; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1758552896; s=zmail; d=pigmoral.tech; i=junhui.liu@pigmoral.tech; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=mLp3ZMo/giWVFh9OCiJLFBIPuGvtpgKq2hcTvkWk2Jo=; b=G9hKiqHZw8NlMYPQEGRnTE3fyVGb+uMWvJCn5KjH5p7sz2dZ9KpmaLJP7VTVKNT6 G1+KKYeHMA0HTMhQmVUfaJWYhupcj7AFXQvFFpe5ADzNsxnAc1lsGKUkzMTXiHJkCec wmYgJhxh8JnCfNaGMhGCvSJoh3gJ+EbuW37uAEJU= Received: by mx.zohomail.com with SMTPS id 1758552894861235.5444135181881; Mon, 22 Sep 2025 07:54:54 -0700 (PDT) From: Junhui Liu Date: Mon, 22 Sep 2025 22:51:49 +0800 Subject: [PATCH 3/5] clk: anlogic: add cru support for Anlogic DR1V90 SoC 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: <20250922-dr1v90-cru-v1-3-e393d758de4e@pigmoral.tech> References: <20250922-dr1v90-cru-v1-0-e393d758de4e@pigmoral.tech> In-Reply-To: <20250922-dr1v90-cru-v1-0-e393d758de4e@pigmoral.tech> To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Junhui Liu , Philipp Zabel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, "fushan.zeng" X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1758552834; l=22107; i=junhui.liu@pigmoral.tech; s=20250910; h=from:subject:message-id; bh=WFluuIf1SDJRVTTtlOH4QZu9CbhyX9v+Jdb36gXJQRw=; b=fRGZoLjVvWriqP/GdxcFgs1nwVG7PqhtCL7cFE6da7MbCsjNGM9PkUIMp7wOpU3U40T+eElZh 541TMicmNlWC9h4DKAXRJDP9B9UTEEiArqE5tGIWn2Qgj3G3pQC7uua X-Developer-Key: i=junhui.liu@pigmoral.tech; a=ed25519; pk=cgATWSU1KfGWmdwNmkPyHGnWgofhqqhE8Vts58wyxe4= X-ZohoMailClient: External The Clock and Reset Unit (CRU) in the Anlogic DR1V90 SoC provides management for the clock and reset. The clock driver includes support for: - Generic clocks: fixed-factor, divider, mux and gate. - PLL: "nm" type (parent * n / m) and "c" type (parent / c). These PLLs are set up by the FSBL and mared as "don't touch" in the datasheet, so only the recal_rate() op is provided. - Divider with gate: support both division and gating (by setting value to 0); some of them require a minimum divider value to avoid timing issues. This also prepares the structure for the reset controller support, registering an auxiliary device for resets. Signed-off-by: Junhui Liu --- drivers/clk/Kconfig | 1 + drivers/clk/Makefile | 1 + drivers/clk/anlogic/Kconfig | 9 ++ drivers/clk/anlogic/Makefile | 5 + drivers/clk/anlogic/cru-dr1v90.c | 190 ++++++++++++++++++++++++++++ drivers/clk/anlogic/cru_dr1.c | 258 +++++++++++++++++++++++++++++++++++= ++++ drivers/clk/anlogic/cru_dr1.h | 117 ++++++++++++++++++ 7 files changed, 581 insertions(+) diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig index 4d56475f94fc1e28823fe6aee626a96847d4e6d5..c5a29c55cddac8b136b2dc1511c= c11ff69f0a55f 100644 --- a/drivers/clk/Kconfig +++ b/drivers/clk/Kconfig @@ -503,6 +503,7 @@ config COMMON_CLK_SP7021 =20 source "drivers/clk/actions/Kconfig" source "drivers/clk/analogbits/Kconfig" +source "drivers/clk/anlogic/Kconfig" source "drivers/clk/baikal-t1/Kconfig" source "drivers/clk/bcm/Kconfig" source "drivers/clk/hisilicon/Kconfig" diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile index 18ed29cfdc1133b6c254190c6092eb263366d5ac..9ce3fdc12aa6b7b9a47f80bfe43= b2af5635cb0bf 100644 --- a/drivers/clk/Makefile +++ b/drivers/clk/Makefile @@ -113,6 +113,7 @@ obj-$(CONFIG_COMMON_CLK_XGENE) +=3D clk-xgene.o # please keep this section sorted lexicographically by directory path name obj-y +=3D actions/ obj-y +=3D analogbits/ +obj-y +=3D anlogic/ obj-$(CONFIG_COMMON_CLK_AT91) +=3D at91/ obj-$(CONFIG_ARCH_ARTPEC) +=3D axis/ obj-$(CONFIG_ARC_PLAT_AXS10X) +=3D axs10x/ diff --git a/drivers/clk/anlogic/Kconfig b/drivers/clk/anlogic/Kconfig new file mode 100644 index 0000000000000000000000000000000000000000..63cf08d43ba85d160dcefc9c67e= adf679af3c08e --- /dev/null +++ b/drivers/clk/anlogic/Kconfig @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: GPL-2.0 + +config ANLOGIC_DR1V90_CRU + tristate "Anlogic DR1V90 clock support" + depends on ARCH_ANLOGIC || COMPILE_TEST + select AUXILIARY_BUS + default ARCH_ANLOGIC + help + Support for the Clock and Reset Unit in Anlogic DR1V90 SoCs. diff --git a/drivers/clk/anlogic/Makefile b/drivers/clk/anlogic/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..b16d93b2e190ce075e52fc76799= 8662ef28ee270 --- /dev/null +++ b/drivers/clk/anlogic/Makefile @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0 + +obj-$(CONFIG_ANLOGIC_DR1V90_CRU) +=3D anlogic-dr1v90-cru.o +anlogic-dr1v90-cru-y +=3D cru_dr1.o +anlogic-dr1v90-cru-y +=3D cru-dr1v90.o diff --git a/drivers/clk/anlogic/cru-dr1v90.c b/drivers/clk/anlogic/cru-dr1= v90.c new file mode 100644 index 0000000000000000000000000000000000000000..c538289c2ee3e24642412cf66c3= 9f605335d668d --- /dev/null +++ b/drivers/clk/anlogic/cru-dr1v90.c @@ -0,0 +1,190 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2025 Shanghai Anlogic Infotech Co., Ltd. + * Copyright (c) 2025 Junhui Liu + */ + +#include +#include +#include +#include +#include + +#include "cru_dr1.h" + +#include + +static const struct clk_div_table cru_div_table_24[] =3D { + { 0xFFFFFF, 1 }, { 0x555555, 2 }, { 0x249249, 3 }, { 0x111111, 4 }, + { 0x084210, 5 }, { 0x041041, 6 }, { 0x020408, 7 }, { 0x010101, 8 }, + { 0x008040, 9 }, { 0x004010, 10 }, { 0x002004, 11 }, { 0x001001, 12 }, + { 0x000800, 13 }, { 0x000400, 14 }, { 0x000200, 15 }, { 0x000100, 16 }, + { 0x000080, 17 }, { 0x000040, 18 }, { 0x000020, 19 }, { 0x000010, 20 }, + { 0x000008, 21 }, { 0x000004, 22 }, { 0x000002, 23 }, { 0x000001, 24 }, + { /* sentinel */ } +}; + +static const struct clk_div_table cru_div_table_32[] =3D { + { 0xFFFFFFFF, 1 }, { 0x55555555, 2 }, { 0x24924924, 3 }, + { 0x11111111, 4 }, { 0x08421084, 5 }, { 0x04104104, 6 }, + { 0x02040810, 7 }, { 0x01010101, 8 }, { 0x00804020, 9 }, + { 0x00401004, 10 }, { 0x00200400, 11 }, { 0x00100100, 12 }, + { 0x00080040, 13 }, { 0x00040010, 14 }, { 0x00020004, 15 }, + { 0x00010001, 16 }, { 0x00008000, 17 }, { 0x00004000, 18 }, + { 0x00002000, 19 }, { 0x00001000, 20 }, { 0x00000800, 21 }, + { 0x00000400, 22 }, { 0x00000200, 23 }, { 0x00000100, 24 }, + { 0x00000080, 25 }, { 0x00000040, 26 }, { 0x00000020, 27 }, + { 0x00000010, 28 }, { 0x00000008, 29 }, { 0x00000004, 30 }, + { 0x00000002, 31 }, { 0x00000001, 32 }, { /* sentinel */ } +}; + +CLK_FIXED_FACTOR_FW_NAME(osc_div2, "osc_div2", "osc_33m", 2, 1, 0); + +CRU_PLL_NM_DEFINE(cpu_pll, CRU_PARENT_NAME(osc_33m), 0x120); +CRU_PLL_C_DEFINE(cpu_pll_4x, CRU_PARENT_HW(cpu_pll), 0x14c); + +CRU_DIV_DEFINE(cpu_4x_div1, CRU_PARENT_HW(cpu_pll_4x), 0x010, 0, 24, + cru_div_table_24, CLK_DIVIDER_READ_ONLY); +CRU_DIV_DEFINE(cpu_4x_div2, CRU_PARENT_HW(cpu_pll_4x), 0x014, 0, 24, + cru_div_table_24, CLK_DIVIDER_READ_ONLY); +CRU_DIV_DEFINE(cpu_4x_div4, CRU_PARENT_HW(cpu_pll_4x), 0x018, 0, 24, + cru_div_table_24, CLK_DIVIDER_READ_ONLY); + +CRU_PLL_NM_DEFINE(io_pll, CRU_PARENT_NAME(osc_33m), 0x220); +CRU_PLL_C_DEFINE(io_1000m, CRU_PARENT_HW(io_pll), 0x248); +CRU_PLL_C_DEFINE(io_400m, CRU_PARENT_HW(io_pll), 0x24c); +CRU_PLL_C_DEFINE(io_25m, CRU_PARENT_HW(io_pll), 0x250); +CRU_PLL_C_DEFINE(io_80m, CRU_PARENT_HW(io_pll), 0x254); + +CRU_DIV_DEFINE(io_400m_div2, CRU_PARENT_HW(io_400m), 0x020, 0, 32, + cru_div_table_32, CLK_DIVIDER_READ_ONLY); +CRU_DIV_DEFINE(io_400m_div4, CRU_PARENT_HW(io_400m), 0x024, 0, 32, + cru_div_table_32, CLK_DIVIDER_READ_ONLY); +CRU_DIV_DEFINE(io_400m_div8, CRU_PARENT_HW(io_400m), 0x028, 0, 32, + cru_div_table_32, CLK_DIVIDER_READ_ONLY); +CRU_DIV_DEFINE(io_400m_div16, CRU_PARENT_HW(io_400m), 0x02c, 0, 32, + cru_div_table_32, CLK_DIVIDER_READ_ONLY); + +CRU_DIV_GATE_DEFINE(qspi, CRU_PARENT_HW(io_1000m), 0x030, 0, 6, NULL, 0, 2= ); +CRU_DIV_GATE_DEFINE(spi, CRU_PARENT_HW(io_1000m), 0x030, 8, 6, NULL, 0, 4); +CRU_DIV_GATE_DEFINE(smc, CRU_PARENT_HW(io_1000m), 0x030, 16, 6, NULL, 0, 4= ); +CRU_DIV_DEFINE(sdio, CRU_PARENT_HW(io_400m), 0x030, 24, 6, NULL, 0); + +CRU_DIV_GATE_DEFINE(gpio_db, CRU_PARENT_HW(io_25m), 0x034, 0, 6, NULL, 0, = 1); +CRU_DIV_GATE_DEFINE(efuse, CRU_PARENT_HW(io_25m), 0x034, 8, 6, NULL, 0, 1); +CRU_DIV_GATE_DEFINE(tvs, CRU_PARENT_HW(io_25m), 0x034, 16, 6, NULL, 0, 1); +CRU_DIV_GATE_DEFINE(trng, CRU_PARENT_HW(io_25m), 0x034, 24, 7, NULL, 0, 1); + +CRU_DIV_GATE_DEFINE(osc_div, CRU_PARENT_NAME(osc_33m), 0x038, 0, 6, NULL, = 0, 1); +CRU_DIV_GATE_DEFINE(pwm, CRU_PARENT_NAME(osc_33m), 0x038, 8, 12, NULL, 0, = 1); + +CRU_DIV_GATE_DEFINE(fclk0, CRU_PARENT_HW(io_400m), 0x03c, 0, 6, NULL, 0, 1= ); +CRU_DIV_GATE_DEFINE(fclk1, CRU_PARENT_HW(io_400m), 0x03c, 8, 6, NULL, 0, 1= ); +CRU_DIV_GATE_DEFINE(fclk2, CRU_PARENT_HW(io_400m), 0x03c, 16, 6, NULL, 0, = 1); +CRU_DIV_GATE_DEFINE(fclk3, CRU_PARENT_HW(io_400m), 0x03c, 24, 6, NULL, 0, = 1); + +static const struct clk_parent_data wdt_parents[] =3D { + CRU_PARENT_HW(osc_div2), + CRU_PARENT_NAME(wdt_ext) +}; +CRU_MUX_DEFINE(wdt_sel, wdt_parents, 0x040, 1, 1); + +static const struct clk_parent_data efuse_parents[] =3D { + CRU_PARENT_NAME(osc_33m), + CRU_PARENT_DIV_HW(efuse) +}; +CRU_MUX_DEFINE(efuse_sel, efuse_parents, 0x040, 2, 1); + +static const struct clk_parent_data can_parents[] =3D { + CRU_PARENT_HW(io_80m), + CRU_PARENT_NAME(can_ext) +}; +CRU_MUX_DEFINE(can_sel, can_parents, 0x040, 3, 1); + +static const struct clk_parent_data cpu_parents[] =3D { + CRU_PARENT_HW(cpu_4x_div1), + CRU_PARENT_HW(cpu_4x_div2) +}; +CRU_MUX_DEFINE(cpu_sel, cpu_parents, 0x040, 5, 1); + +CRU_GATE_DEFINE(can0, CRU_PARENT_HW(can_sel), 0x08c, 20, CLK_GATE_SET_TO_D= ISABLE); +CRU_GATE_DEFINE(can1, CRU_PARENT_HW(can_sel), 0x08c, 21, CLK_GATE_SET_TO_D= ISABLE); + +static const struct cru_clk dr1v90_cru_clks[] =3D { + [CLK_OSC_DIV2] =3D { &osc_div2.hw, NULL }, + [CLK_CPU_PLL] =3D { &cpu_pll.hw, &cpu_pll.reg }, + [CLK_CPU_PLL_4X] =3D { &cpu_pll_4x.hw, &cpu_pll_4x.reg }, + [CLK_CPU_4X] =3D { &cpu_4x_div1.hw, &cpu_4x_div1.reg }, + [CLK_CPU_2X] =3D { &cpu_4x_div2.hw, &cpu_4x_div2.reg }, + [CLK_CPU_1X] =3D { &cpu_4x_div4.hw, &cpu_4x_div4.reg }, + [CLK_IO_PLL] =3D { &io_pll.hw, &io_pll.reg }, + [CLK_IO_1000M] =3D { &io_1000m.hw, &io_1000m.reg }, + [CLK_IO_400M] =3D { &io_400m.hw, &io_400m.reg }, + [CLK_IO_25M] =3D { &io_25m.hw, &io_25m.reg }, + [CLK_IO_80M] =3D { &io_80m.hw, &io_80m.reg }, + [CLK_IO_400M_DIV2] =3D { &io_400m_div2.hw, &io_400m_div2.reg }, + [CLK_IO_400M_DIV4] =3D { &io_400m_div4.hw, &io_400m_div4.reg }, + [CLK_IO_400M_DIV8] =3D { &io_400m_div8.hw, &io_400m_div8.reg }, + [CLK_IO_400M_DIV16] =3D { &io_400m_div16.hw, &io_400m_div16.reg }, + [CLK_QSPI] =3D { &qspi.divider.hw, &qspi.divider.reg }, + [CLK_SPI] =3D { &spi.divider.hw, &spi.divider.reg }, + [CLK_SMC] =3D { &smc.divider.hw, &smc.divider.reg }, + [CLK_SDIO] =3D { &sdio.hw, &sdio.reg }, + [CLK_GPIO_DB] =3D { &gpio_db.divider.hw, &gpio_db.divider.reg }, + [CLK_EFUSE] =3D { &efuse.divider.hw, &efuse.divider.reg }, + [CLK_TVS] =3D { &tvs.divider.hw, &tvs.divider.reg }, + [CLK_TRNG] =3D { &trng.divider.hw, &trng.divider.reg }, + [CLK_OSC_DIV] =3D { &osc_div.divider.hw, &osc_div.divider.reg }, + [CLK_PWM] =3D { &pwm.divider.hw, &pwm.divider.reg }, + [CLK_FCLK0] =3D { &fclk0.divider.hw, &fclk0.divider.reg }, + [CLK_FCLK1] =3D { &fclk1.divider.hw, &fclk1.divider.reg }, + [CLK_FCLK2] =3D { &fclk2.divider.hw, &fclk2.divider.reg }, + [CLK_FCLK3] =3D { &fclk3.divider.hw, &fclk3.divider.reg }, + [CLK_WDT_SEL] =3D { &wdt_sel.hw, &wdt_sel.reg }, + [CLK_EFUSE_SEL] =3D { &efuse_sel.hw, &efuse_sel.reg }, + [CLK_CAN_SEL] =3D { &can_sel.hw, &can_sel.reg }, + [CLK_CPU_SEL] =3D { &cpu_sel.hw, &cpu_sel.reg }, + [CLK_CAN0] =3D { &can0.hw, &can0.reg }, + [CLK_CAN1] =3D { &can1.hw, &can1.reg } +}; + +static int dr1v90_cru_probe(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + void __iomem *base; + int ret; + + base =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(base)) + return PTR_ERR(base); + + ret =3D dr1_cru_clk_register(dev, base, dr1v90_cru_clks, + ARRAY_SIZE(dr1v90_cru_clks)); + if (ret) + return dev_err_probe(dev, ret, "failed to register clocks\n"); + + ret =3D dr1_cru_reset_register(dev); + if (ret) + return dev_err_probe(dev, ret, "failed to register resets\n"); + + return 0; +} + +static const struct of_device_id dr1v90_cru_ids[] =3D { + { .compatible =3D "anlogic,dr1v90-cru" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, dr1v90_cru_ids); + +static struct platform_driver dr1v90_cru_driver =3D { + .driver =3D { + .name =3D "dr1v90-cru", + .of_match_table =3D dr1v90_cru_ids, + }, + .probe =3D dr1v90_cru_probe, +}; +module_platform_driver(dr1v90_cru_driver); + +MODULE_AUTHOR("Junhui Liu "); +MODULE_DESCRIPTION("Anlogic DR1V90 CRU driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/clk/anlogic/cru_dr1.c b/drivers/clk/anlogic/cru_dr1.c new file mode 100644 index 0000000000000000000000000000000000000000..5645149fd8cd9195b9075eaa278= f37bb3cb118e7 --- /dev/null +++ b/drivers/clk/anlogic/cru_dr1.c @@ -0,0 +1,258 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2025 Shanghai Anlogic Infotech Co., Ltd. + * Copyright (c) 2025 Junhui Liu + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cru_dr1.h" + +static unsigned long cru_pll_nm_recalc_rate(struct clk_hw *hw, + unsigned long parent_rate) +{ + struct cru_pll *pll =3D hw_to_cru_pll(hw); + u32 mult, div; + + div =3D FIELD_GET(GENMASK(6, 0), readl(pll->reg)) + 1; + mult =3D FIELD_GET(GENMASK(6, 0), readl(pll->reg + 4)) + 1; + + return parent_rate * mult / div; +} + +const struct clk_ops dr1_cru_pll_nm_ops =3D { + .recalc_rate =3D cru_pll_nm_recalc_rate, +}; + +static unsigned long cru_pll_c_recalc_rate(struct clk_hw *hw, + unsigned long parent_rate) +{ + struct cru_pll *pll =3D hw_to_cru_pll(hw); + u32 div; + + div =3D FIELD_GET(GENMASK(30, 24), readl(pll->reg)) + 1; + + return parent_rate / div; +} + +const struct clk_ops dr1_cru_pll_c_ops =3D { + .recalc_rate =3D cru_pll_c_recalc_rate, +}; + +static void cru_div_gate_endisable(struct clk_hw *hw, int enable) +{ + struct cru_div_gate *div_gate =3D hw_to_cru_div_gate(hw); + struct clk_divider *divider =3D &div_gate->divider; + u32 reg; + + reg =3D readl(divider->reg); + reg &=3D ~(clk_div_mask(divider->width) << divider->shift); + + if (enable) + reg |=3D div_gate->val << divider->shift; + + writel(reg, divider->reg); +} + +static int cru_div_gate_enable(struct clk_hw *hw) +{ + cru_div_gate_endisable(hw, 1); + + return 0; +} + +static void cru_div_gate_disable(struct clk_hw *hw) +{ + cru_div_gate_endisable(hw, 0); +} + +static int cru_div_gate_is_enabled(struct clk_hw *hw) +{ + struct cru_div_gate *div_gate =3D hw_to_cru_div_gate(hw); + struct clk_divider *divider =3D &div_gate->divider; + u32 val; + + val =3D readl(divider->reg) >> divider->shift; + val &=3D clk_div_mask(divider->width); + + return !!val; +} + +static unsigned long cru_div_gate_recalc_rate(struct clk_hw *hw, + unsigned long parent_rate) +{ + struct cru_div_gate *div_gate =3D hw_to_cru_div_gate(hw); + struct clk_divider *divider =3D &div_gate->divider; + unsigned int val; + + val =3D readl(divider->reg) >> divider->shift; + val &=3D clk_div_mask(divider->width); + + if (val < div_gate->min) + return 0; + + return divider_recalc_rate(hw, parent_rate, val, divider->table, + divider->flags, divider->width); +} + +static long cru_div_gate_round_rate(struct clk_hw *hw, unsigned long rate, + unsigned long *prate) +{ + struct clk_divider *divider =3D to_clk_divider(hw); + + return divider_round_rate(hw, rate, prate, divider->table, + divider->width, divider->flags); +} + +static int cru_div_gate_determine_rate(struct clk_hw *hw, + struct clk_rate_request *req) +{ + struct cru_div_gate *div_gate =3D hw_to_cru_div_gate(hw); + struct clk_divider *divider =3D &div_gate->divider; + unsigned long maxdiv, mindiv; + int div =3D 0; + + maxdiv =3D clk_div_mask(divider->width) + 1; + mindiv =3D div_gate->min + 1; + + div =3D DIV_ROUND_UP_ULL(req->best_parent_rate, req->rate); + div =3D div > maxdiv ? maxdiv : div; + div =3D div < mindiv ? mindiv : div; + + req->rate =3D DIV_ROUND_UP_ULL(req->best_parent_rate, div); + + return 0; +} + +static int cru_div_gate_set_rate(struct clk_hw *hw, unsigned long rate, + unsigned long parent_rate) +{ + struct cru_div_gate *div_gate =3D hw_to_cru_div_gate(hw); + struct clk_divider *divider =3D &div_gate->divider; + int value; + u32 reg; + + if (!__clk_get_enable_count(hw->clk)) + return 0; + + value =3D divider_get_val(rate, parent_rate, divider->table, + divider->width, divider->flags); + if (value < 0) + return value; + + if (value < div_gate->min) + value =3D div_gate->min; + + reg =3D readl(divider->reg); + reg &=3D ~(clk_div_mask(divider->width) << divider->shift); + reg |=3D (u32)value << divider->shift; + writel(reg, divider->reg); + + div_gate->val =3D reg; + + return 0; +} + +static int cru_div_gate_init(struct clk_hw *hw) +{ + struct cru_div_gate *div_gate =3D hw_to_cru_div_gate(hw); + struct clk_divider *divider =3D &div_gate->divider; + u32 val; + + val =3D readl(divider->reg) >> divider->shift; + val &=3D clk_div_mask(divider->width); + div_gate->val =3D val; + + return 0; +} + +const struct clk_ops dr1_cru_div_gate_ops =3D { + .enable =3D cru_div_gate_enable, + .disable =3D cru_div_gate_disable, + .is_enabled =3D cru_div_gate_is_enabled, + .recalc_rate =3D cru_div_gate_recalc_rate, + .round_rate =3D cru_div_gate_round_rate, + .determine_rate =3D cru_div_gate_determine_rate, + .set_rate =3D cru_div_gate_set_rate, + .init =3D cru_div_gate_init, +}; + +int dr1_cru_clk_register(struct device *dev, void __iomem *base, + const struct cru_clk *clks, int nr_clks) +{ + struct clk_hw_onecell_data *priv; + int i, ret; + + priv =3D devm_kzalloc(dev, struct_size(priv, hws, nr_clks), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + for (i =3D 0; i < nr_clks; i++) { + const struct cru_clk *clk =3D &clks[i]; + + if (clk->reg) + *(clk->reg) +=3D (uintptr_t)base; + + ret =3D devm_clk_hw_register(dev, clk->hw); + if (ret) + return ret; + + priv->hws[i] =3D clk->hw; + } + + priv->num =3D nr_clks; + + ret =3D devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, priv); + if (ret) + dev_err(dev, "failed to add clock hardware provider\n"); + + return ret; +} + +static void dr1_cru_cadev_release(struct device *dev) +{ + struct auxiliary_device *adev =3D to_auxiliary_dev(dev); + + kfree(adev); +} + +static void dr1_cru_adev_unregister(void *_adev) +{ + struct auxiliary_device *adev =3D _adev; + + auxiliary_device_delete(adev); + auxiliary_device_uninit(adev); +} + +int dr1_cru_reset_register(struct device *dev) +{ + struct auxiliary_device *adev __free(kfree); + int ret; + + adev =3D kzalloc(sizeof(*adev), GFP_KERNEL); + if (!adev) + return -ENOMEM; + + adev->name =3D "reset"; + adev->dev.parent =3D dev; + adev->dev.release =3D dr1_cru_cadev_release; + + ret =3D auxiliary_device_init(adev); + if (ret) + return ret; + + ret =3D auxiliary_device_add(adev); + if (ret) { + auxiliary_device_uninit(adev); + return ret; + } + + return devm_add_action_or_reset(dev, dr1_cru_adev_unregister, adev); +} diff --git a/drivers/clk/anlogic/cru_dr1.h b/drivers/clk/anlogic/cru_dr1.h new file mode 100644 index 0000000000000000000000000000000000000000..4599a3c36d08e8d20105a225336= b87426821143b --- /dev/null +++ b/drivers/clk/anlogic/cru_dr1.h @@ -0,0 +1,117 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2025 Shanghai Anlogic Infotech Co., Ltd. + * Copyright (c) 2025 Junhui Liu + */ + +#ifndef _CRU_DR1_H_ +#define _CRU_DR1_H_ + +#include "linux/clk-provider.h" + +struct cru_pll { + struct clk_hw hw; + void __iomem *reg; +}; + +struct cru_div_gate { + struct clk_divider divider; + u32 val; + u8 min; /* Minimum divider value to avoid timing issues */ +}; + +struct cru_clk { + struct clk_hw *hw; + void **reg; +}; + +#define CRU_PARENT_NAME(_name) { .fw_name =3D #_name } +#define CRU_PARENT_HW(_parent) { .hw =3D &_parent.hw } +#define CRU_PARENT_DIV_HW(_parent) { .hw =3D &_parent.divider.hw } + +#define CRU_INITHW(_name, _parent, _ops) \ + .hw.init =3D &(struct clk_init_data) { \ + .name =3D #_name, \ + .parent_data =3D (const struct clk_parent_data[]) \ + { _parent }, \ + .num_parents =3D 1, \ + .ops =3D &_ops, \ + } + +#define CRU_INITHW_PARENTS(_name, _parents, _ops) \ + .hw.init =3D CLK_HW_INIT_PARENTS_DATA(#_name, _parents, &_ops, 0) + +#define CRU_PLL_NM_DEFINE(_name, _parent, _reg) \ +static struct cru_pll _name =3D { \ + .reg =3D (void __iomem *)(_reg), \ + CRU_INITHW(_name, _parent, dr1_cru_pll_nm_ops), \ +} + +#define CRU_PLL_C_DEFINE(_name, _parent, _reg) \ +static struct cru_pll _name =3D { \ + .reg =3D (void __iomem *)(_reg), \ + CRU_INITHW(_name, _parent, dr1_cru_pll_c_ops), \ +} + +#define CRU_DIV_DEFINE(_name, _parent, _reg, _shift, _width, _table, \ + _flags) \ +static struct clk_divider _name =3D { \ + .shift =3D _shift, \ + .width =3D _width, \ + .flags =3D _flags, \ + .table =3D _table, \ + .reg =3D (void __iomem *)(_reg), \ + CRU_INITHW(_name, _parent, clk_divider_ops), \ +} + +#define CRU_DIV_GATE_DEFINE(_name, _parent, _reg, _shift, _width, \ + _table, _flags, _min) \ +static struct cru_div_gate _name =3D { \ + .min =3D _min, \ + .divider =3D { \ + .shift =3D _shift, \ + .width =3D _width, \ + .flags =3D _flags, \ + .table =3D _table, \ + .reg =3D (void __iomem *)(_reg), \ + CRU_INITHW(_name, _parent, dr1_cru_div_gate_ops), \ + } \ +} + +#define CRU_MUX_DEFINE(_name, _parents, _reg, _shift, _width) \ +static struct clk_mux _name =3D { \ + .shift =3D _shift, \ + .mask =3D GENMASK(_width - 1, 0), \ + .reg =3D (void __iomem *)(_reg), \ + CRU_INITHW_PARENTS(_name, _parents, clk_mux_ops) \ +} + +#define CRU_GATE_DEFINE(_name, _parent, _reg, _bit_idx, _flags) \ +static struct clk_gate _name =3D { \ + .bit_idx =3D _bit_idx, \ + .flags =3D _flags, \ + .reg =3D (void __iomem *)(_reg), \ + CRU_INITHW(_name, _parent, clk_gate_ops) \ +} + +static inline struct cru_pll *hw_to_cru_pll(struct clk_hw *hw) +{ + return container_of(hw, struct cru_pll, hw); +} + +static inline struct cru_div_gate *hw_to_cru_div_gate(struct clk_hw *hw) +{ + struct clk_divider *divider =3D to_clk_divider(hw); + + return container_of(divider, struct cru_div_gate, divider); +} + +extern const struct clk_ops dr1_cru_pll_nm_ops; +extern const struct clk_ops dr1_cru_pll_c_ops; +extern const struct clk_ops dr1_cru_div_gate_ops; + +int dr1_cru_clk_register(struct device *dev, void __iomem *base, + const struct cru_clk *clks, int nr_clks); +int dr1_cru_reset_register(struct device *dev); + +#endif /* _CRU_DR1_H_ */ --=20 2.51.0 From nobody Thu Oct 2 05:03:19 2025 Received: from sender4-op-o16.zoho.com (sender4-op-o16.zoho.com [136.143.188.16]) (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 5D75426B777; Mon, 22 Sep 2025 14:55:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758552939; cv=pass; b=nk8n8Zx0Zh547IEbo+8PP9BCn/8Lb5hbejn1b6hYrgSxY2AvVHrZxF3+lOwNitbawVOwMO2/XfpNJQ1D3zvU/DcGnAm9tqH17EDNO9fuM9WOAijTN/MxcNBFt9TNXTH83oRgQg9JiNgIE3q7wUXQpixGll3hSN9cXqsQPA3YE6c= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758552939; c=relaxed/simple; bh=9oDsGPNv/SAQ6fcn0oxyan9xEcehvHNYnAPzf4OFj1s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=q9AQ2PY6GtHtgXr9SCHuuThQzsnv7JuAw+2yBMQEm8HH7CljnaYnFF7upG9VPgoDEv2PCLzLtMGa8gkWS4qTFJQ1JSNFLiWVlh4cBhlhIxX9QaCU4huNZvj/EVuB7zX6/iX4Id5/1icUXz1uhqgJ5xLFY0sn74J7hBuy32dnyMo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pigmoral.tech; spf=pass smtp.mailfrom=pigmoral.tech; dkim=pass (1024-bit key) header.d=pigmoral.tech header.i=junhui.liu@pigmoral.tech header.b=QboX/JA3; arc=pass smtp.client-ip=136.143.188.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pigmoral.tech Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pigmoral.tech Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=pigmoral.tech header.i=junhui.liu@pigmoral.tech header.b="QboX/JA3" ARC-Seal: i=1; a=rsa-sha256; t=1758552910; cv=none; d=zohomail.com; s=zohoarc; b=XKvxcm4abdNWcZtZyzkUtXCD3igf0CLyIMGzwyg7mY/wFW7Fi0fblGzDD5U77nu/Pdxf6pQseT2XiglQRDqCH6IRGn63JPct7dmWvSqdrPlZr8gLvhZ04f03gX35L3RH6JzY2X0Bm9d0ynLlTYIBaHLq2iwTFiZh0uLeqYi+JGw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1758552910; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=VYjqi7ZPOyzMEvVW7DcEvSzrVujGkkSlOHUUxycbCQY=; b=CalENtVsiJiZkYi0HvVqFyXFntshZaSg9TWO8qE1HrtLqCzsmf64inJ9zQJ3J/KMjP3730U5D9lQz7nQIm8ijVRdyEemKom06zMUEVKFnQWih1ONYHfaD1mov0+t7xvuRKvS23ZLBOyl4f9qx0wsGTqou3CS1MKpVBvFfJf0b0w= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=pigmoral.tech; spf=pass smtp.mailfrom=junhui.liu@pigmoral.tech; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1758552910; s=zmail; d=pigmoral.tech; i=junhui.liu@pigmoral.tech; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=VYjqi7ZPOyzMEvVW7DcEvSzrVujGkkSlOHUUxycbCQY=; b=QboX/JA3hbZ2Uc5PvW1nXRDZkcVmPkckO9GcCLNmLLB+OJF9NndW6KxZmr6y+VIj +h/ISmG2U6nKzjEzim2i9v9Dk9JGDOcSmb4LFbczKTYyq0epBIfTMBgK82YlIlZzLGe HWVPGpEYzieHrhEulSlvRFdbWUMoNv6fGMaGNF2s= Received: by mx.zohomail.com with SMTPS id 1758552908801603.2694173474916; Mon, 22 Sep 2025 07:55:08 -0700 (PDT) From: Junhui Liu Date: Mon, 22 Sep 2025 22:51:50 +0800 Subject: [PATCH 4/5] reset: anlogic: add support for Anlogic DR1V90 resets 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: <20250922-dr1v90-cru-v1-4-e393d758de4e@pigmoral.tech> References: <20250922-dr1v90-cru-v1-0-e393d758de4e@pigmoral.tech> In-Reply-To: <20250922-dr1v90-cru-v1-0-e393d758de4e@pigmoral.tech> To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Junhui Liu , Philipp Zabel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, "fushan.zeng" X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1758552834; l=6149; i=junhui.liu@pigmoral.tech; s=20250910; h=from:subject:message-id; bh=9oDsGPNv/SAQ6fcn0oxyan9xEcehvHNYnAPzf4OFj1s=; b=W85sTOUqX951oStBEOpahvLiwEt+WR4EGC0QXkcyRr0aKWTXiOQ3mvTfyi//WI1PxsZZPf9OD ZRsyWGu8beDAzefHKptdv3aswXvx8VnszxabxfuiZiwI+5SY2/kjwPK X-Developer-Key: i=junhui.liu@pigmoral.tech; a=ed25519; pk=cgATWSU1KfGWmdwNmkPyHGnWgofhqqhE8Vts58wyxe4= X-ZohoMailClient: External Add reset controller support for the Anlogic DR1V90 SoC, which is an auxiliary device associated with the Clock and Reset Unit (CRU). All resets are active-low. Signed-off-by: Junhui Liu --- drivers/reset/Kconfig | 9 +++ drivers/reset/Makefile | 1 + drivers/reset/reset-dr1v90.c | 136 +++++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 146 insertions(+) diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig index 635eef469ab797ac8ef39d95a82d47071aeec630..bc7a1abb907806a1efaf568ee3d= c3ca6081f667b 100644 --- a/drivers/reset/Kconfig +++ b/drivers/reset/Kconfig @@ -66,6 +66,15 @@ config RESET_BRCMSTB_RESCAL This enables the RESCAL reset controller for SATA, PCIe0, or PCIe1 on BCM7216 or the BCM2712. =20 +config RESET_DR1V90 + tristate "Anlogic DR1V90 reset controller" + depends on ARCH_ANLOGIC || COMPILE_TEST + select AUXILIARY_BUS + default ARCH_ANLOGIC + help + This enables the reset controller driver for Anlogic DR1V90 SoCs + provided by the CRU unit. + config RESET_EYEQ bool "Mobileye EyeQ reset controller" depends on MACH_EYEQ5 || MACH_EYEQ6H || COMPILE_TEST diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile index a917d2522e8d12af0dd2b252e493fa4fc9eabecf..441307fd6ccd6fe0793fe819a60= e66888efcb92c 100644 --- a/drivers/reset/Makefile +++ b/drivers/reset/Makefile @@ -12,6 +12,7 @@ obj-$(CONFIG_RESET_BCM6345) +=3D reset-bcm6345.o obj-$(CONFIG_RESET_BERLIN) +=3D reset-berlin.o obj-$(CONFIG_RESET_BRCMSTB) +=3D reset-brcmstb.o obj-$(CONFIG_RESET_BRCMSTB_RESCAL) +=3D reset-brcmstb-rescal.o +obj-$(CONFIG_RESET_DR1V90) +=3D reset-dr1v90.o obj-$(CONFIG_RESET_EYEQ) +=3D reset-eyeq.o obj-$(CONFIG_RESET_GPIO) +=3D reset-gpio.o obj-$(CONFIG_RESET_HSDK) +=3D reset-hsdk.o diff --git a/drivers/reset/reset-dr1v90.c b/drivers/reset/reset-dr1v90.c new file mode 100644 index 0000000000000000000000000000000000000000..914bbb9331969939f039bfb3caa= 6ef9d88a48b96 --- /dev/null +++ b/drivers/reset/reset-dr1v90.c @@ -0,0 +1,136 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2025 Shanghai Anlogic Infotech Co., Ltd. + * Copyright (c) 2025 Junhui Liu + */ + +#include +#include "linux/device.h" +#include +#include +#include + +#include + +struct dr1v90_reset_map { + u32 offset; + u32 bit; +}; + +struct dr1v90_reset_controller { + struct reset_controller_dev rcdev; + void __iomem *base; +}; + +static inline struct dr1v90_reset_controller * +to_dr1v90_reset_controller(struct reset_controller_dev *rcdev) +{ + return container_of(rcdev, struct dr1v90_reset_controller, rcdev); +} + +static const struct dr1v90_reset_map dr1v90_resets[] =3D { + [RESET_OCM] =3D { 0x74, BIT(4)}, + [RESET_QSPI] =3D { 0x74, BIT(5)}, + [RESET_SMC] =3D { 0x74, BIT(6)}, + [RESET_WDT] =3D { 0x74, BIT(7)}, + [RESET_DMAC_AXI] =3D { 0x74, BIT(8)}, + [RESET_DMAC_AHB] =3D { 0x74, BIT(9)}, + [RESET_NPU] =3D { 0x74, BIT(12)}, + [RESET_JPU] =3D { 0x74, BIT(13)}, + [RESET_DDRBUS] =3D { 0x74, BIT(14)}, + [RESET_NIC_HP0] =3D { 0x78, BIT(0)}, + [RESET_NIC_HP1] =3D { 0x78, BIT(1)}, + [RESET_NIC_GP0M] =3D { 0x78, BIT(4)}, + [RESET_NIC_GP1M] =3D { 0x78, BIT(5)}, + [RESET_GPIO] =3D { 0x78, BIT(8)}, + [RESET_IPC] =3D { 0x78, BIT(12)}, + [RESET_USB0] =3D { 0x7C, BIT(0)}, + [RESET_USB1] =3D { 0x7C, BIT(1)}, + [RESET_GBE0] =3D { 0x7C, BIT(4)}, + [RESET_GBE1] =3D { 0x7C, BIT(5)}, + [RESET_SDIO0] =3D { 0x7C, BIT(8)}, + [RESET_SDIO1] =3D { 0x7C, BIT(9)}, + [RESET_UART0] =3D { 0x7C, BIT(12)}, + [RESET_UART1] =3D { 0x7C, BIT(13)}, + [RESET_SPI0] =3D { 0x7C, BIT(16)}, + [RESET_SPI1] =3D { 0x7C, BIT(17)}, + [RESET_CAN0] =3D { 0x7C, BIT(20)}, + [RESET_CAN1] =3D { 0x7C, BIT(21)}, + [RESET_TTC0] =3D { 0x7C, BIT(24)}, + [RESET_TTC1] =3D { 0x7C, BIT(25)}, + [RESET_I2C0] =3D { 0x7C, BIT(28)}, + [RESET_I2C1] =3D { 0x7C, BIT(29)} +}; + +static int dr1v90_reset_control_update(struct reset_controller_dev *rcdev, + unsigned long id, bool assert) +{ + struct dr1v90_reset_controller *rstc =3D to_dr1v90_reset_controller(rcdev= ); + u32 offset =3D dr1v90_resets[id].offset; + u32 bit =3D dr1v90_resets[id].bit; + u32 reg; + + reg =3D readl(rstc->base + offset); + if (assert) + reg &=3D ~bit; + else + reg |=3D bit; + writel(reg, rstc->base + offset); + + return 0; +} + +static int dr1v90_reset_control_assert(struct reset_controller_dev *rcdev, + unsigned long id) +{ + return dr1v90_reset_control_update(rcdev, id, true); +} + +static int dr1v90_reset_control_deassert(struct reset_controller_dev *rcde= v, + unsigned long id) +{ + return dr1v90_reset_control_update(rcdev, id, false); +} + +static const struct reset_control_ops dr1v90_reset_control_ops =3D { + .assert =3D dr1v90_reset_control_assert, + .deassert =3D dr1v90_reset_control_deassert, +}; + +static int dr1v90_reset_probe(struct auxiliary_device *adev, + const struct auxiliary_device_id *id) +{ + struct dr1v90_reset_controller *rstc; + struct device *dev =3D &adev->dev; + + rstc =3D devm_kzalloc(dev, sizeof(*rstc), GFP_KERNEL); + if (!rstc) + return -ENOMEM; + + rstc->base =3D of_iomap(dev->parent->of_node, 0); + rstc->rcdev.dev =3D dev; + rstc->rcdev.nr_resets =3D ARRAY_SIZE(dr1v90_resets); + rstc->rcdev.of_node =3D dev->parent->of_node; + rstc->rcdev.ops =3D &dr1v90_reset_control_ops; + rstc->rcdev.owner =3D THIS_MODULE; + + return devm_reset_controller_register(dev, &rstc->rcdev); +} + +static const struct auxiliary_device_id dr1v90_reset_ids[] =3D { + { + .name =3D "anlogic_dr1v90_cru.reset" + }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(auxiliary, dr1v90_reset_ids); + +static struct auxiliary_driver dr1v90_reset_driver =3D { + .probe =3D dr1v90_reset_probe, + .id_table =3D dr1v90_reset_ids, +}; +module_auxiliary_driver(dr1v90_reset_driver); + +MODULE_AUTHOR("Junhui Liu "); +MODULE_DESCRIPTION("Anlogic DR1V90 reset controller driver"); +MODULE_LICENSE("GPL"); --=20 2.51.0 From nobody Thu Oct 2 05:03:19 2025 Received: from sender4-op-o16.zoho.com (sender4-op-o16.zoho.com [136.143.188.16]) (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 B4D312D77EF; Mon, 22 Sep 2025 14:55:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758552946; cv=pass; b=MOHvIdFxHIbF1d/5PnA/IKQ0wBW5VX1zi8aR3KwPjUV1xXXIGMcxpNI4uunBpLtA2dtnnXX4c4yYUQZMEPAn3e2ssGu5NNkOyHCydQic0BG2OZ4jM1j4D7ZLVB6nRCIQ8uYht6cwoCXXMn+9qdlXnFX4kmLgNJRfTOoz0wDFJ1g= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758552946; c=relaxed/simple; bh=cb7wy+ZwN39ONi58h69i1DPSVfww4xXrfbM+TXkw/WI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gzfLU6hNjnTBzjyIUG9E6ITfz+BLdzvyopsjLJCi6e86ggj1MU/plXZEjijfNhdIKD3tRHUrEHHUrD+ne5/DRaiJ7h6wqKeTYyJSqMKSBL0cqX9E1pgjX/jsWgFntJuapWEfn9cclSxL1vIgqsURKrrqIVuusA7LkSvmKSoiLsw= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pigmoral.tech; spf=pass smtp.mailfrom=pigmoral.tech; dkim=pass (1024-bit key) header.d=pigmoral.tech header.i=junhui.liu@pigmoral.tech header.b=MkzjBf4f; arc=pass smtp.client-ip=136.143.188.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pigmoral.tech Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pigmoral.tech Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=pigmoral.tech header.i=junhui.liu@pigmoral.tech header.b="MkzjBf4f" ARC-Seal: i=1; a=rsa-sha256; t=1758552923; cv=none; d=zohomail.com; s=zohoarc; b=C55XzlbDLCmFbDiqjupdn3RbRvL/2iczTfU27UwBI4plR6YtkuDjy/pabhffB6p8nXzsPaNB4wlXlvfTY3j74iiwho6OqUvX//euxnMw1kEia6d860xS+CheNziVk7cbaXlqm85TQdoBhr085pEXZ4f7EtI25kun7g5sAANIUO0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1758552923; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=PLzv6fg3fqqkM8iKZ+L1jhNCwLYKzVSOP0OdN57SCX8=; b=RJeWA3DqZvG8gjVnDJJ290dMwFXazbC23ufhwfITvd6mlu4ppzwoZmIzFbV6quvzIxylKPtv73bEFAgoo2LTntxzQd2vguSKnRoqjCUeqNswjG6QvA3f4xaxZA1gwKEBwUVRiRT4dcx1GHDgX1S3VxZMapoUF9Dni6xBTIqCxbU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=pigmoral.tech; spf=pass smtp.mailfrom=junhui.liu@pigmoral.tech; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1758552923; s=zmail; d=pigmoral.tech; i=junhui.liu@pigmoral.tech; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=PLzv6fg3fqqkM8iKZ+L1jhNCwLYKzVSOP0OdN57SCX8=; b=MkzjBf4fxvx6JK7eEAmxLrzmYFsyDwsopO+l8NiJwOrpaQYQkr8P0K8Wl6cylHAD p06iSvqcL0U0Mm/6G3xVU/f6ezlT7B3A5z1C7dcbVYOT5sgB1Wh6v0AquwAlXUrzSJy J/+8woSfozohZgZSFj93cspma7J6hH/mkftdPxhs= Received: by mx.zohomail.com with SMTPS id 1758552920497610.5552985610591; Mon, 22 Sep 2025 07:55:20 -0700 (PDT) From: Junhui Liu Date: Mon, 22 Sep 2025 22:51:51 +0800 Subject: [PATCH 5/5] riscv: dts: anlogic: add clocks and CRU for DR1V90 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: <20250922-dr1v90-cru-v1-5-e393d758de4e@pigmoral.tech> References: <20250922-dr1v90-cru-v1-0-e393d758de4e@pigmoral.tech> In-Reply-To: <20250922-dr1v90-cru-v1-0-e393d758de4e@pigmoral.tech> To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Junhui Liu , Philipp Zabel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, "fushan.zeng" X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1758552834; l=2783; i=junhui.liu@pigmoral.tech; s=20250910; h=from:subject:message-id; bh=cb7wy+ZwN39ONi58h69i1DPSVfww4xXrfbM+TXkw/WI=; b=buSBznMbOgHdkJQ7FZtYm3RCpZxmyXDsUY+oZXW+9KxaSJHF+RaKU0KAdU860IixMtuCCq3mH GvDkjS5Jr3VDxCDn3E9hmEHCWpG5kWwp9vZ8l7PKnL7HY3761+D2PZB X-Developer-Key: i=junhui.liu@pigmoral.tech; a=ed25519; pk=cgATWSU1KfGWmdwNmkPyHGnWgofhqqhE8Vts58wyxe4= X-ZohoMailClient: External Add clocks and introduce the CRU (Clock and Reset) unit node for Anlogic DR1V90 SoC, providing both clock and reset support. The DR1V90 SoC uses three external clocks: - A 33 MHz crystal oscillator as the main system clock. - Two optional external clocks (via IO) for the CAN and WDT modules. Signed-off-by: Junhui Liu --- arch/riscv/boot/dts/anlogic/dr1v90.dtsi | 41 +++++++++++++++++++++++++++++= ++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/arch/riscv/boot/dts/anlogic/dr1v90.dtsi b/arch/riscv/boot/dts/= anlogic/dr1v90.dtsi index f9f8754ceb5247d3ca25e6a65b3f915916ba6173..6458093dcf27afd640265aa07be= 9b93d6cb72f8a 100644 --- a/arch/riscv/boot/dts/anlogic/dr1v90.dtsi +++ b/arch/riscv/boot/dts/anlogic/dr1v90.dtsi @@ -3,6 +3,9 @@ * Copyright (C) 2025 Junhui Liu */ =20 +#include +#include + /dts-v1/; / { #address-cells =3D <2>; @@ -39,6 +42,27 @@ cpu0_intc: interrupt-controller { }; }; =20 + clocks { + can_ext: clock-ext-can { + compatible =3D "fixed-clock"; + clock-output-names =3D "can_ext"; + #clock-cells =3D <0>; + }; + + osc_33m: clock-33m { + compatible =3D "fixed-clock"; + clock-frequency =3D <33333333>; + clock-output-names =3D "osc_33m"; + #clock-cells =3D <0>; + }; + + wdt_ext: clock-ext-wdt { + compatible =3D "fixed-clock"; + clock-output-names =3D "wdt_ext"; + #clock-cells =3D <0>; + }; + }; + soc { compatible =3D "simple-bus"; interrupt-parent =3D <&plic>; @@ -65,21 +89,34 @@ plic: interrupt-controller@6c000000 { uart0: serial@f8400000 { compatible =3D "anlogic,dr1v90-uart", "snps,dw-apb-uart"; reg =3D <0x0 0xf8400000 0x0 0x1000>; - clock-frequency =3D <50000000>; + clocks =3D <&cru CLK_IO_400M_DIV8>, <&cru CLK_CPU_1X>; + clock-names =3D "baudclk", "apb_pclk"; interrupts =3D <71>; reg-io-width =3D <4>; reg-shift =3D <2>; + resets =3D <&cru RESET_UART0>; status =3D "disabled"; }; =20 uart1: serial@f8401000 { compatible =3D "anlogic,dr1v90-uart", "snps,dw-apb-uart"; reg =3D <0x0 0xf8401000 0x0 0x1000>; - clock-frequency =3D <50000000>; + clocks =3D <&cru CLK_IO_400M_DIV8>, <&cru CLK_CPU_1X>; + clock-names =3D "baudclk", "apb_pclk"; interrupts =3D <72>; reg-io-width =3D <4>; reg-shift =3D <2>; + resets =3D <&cru RESET_UART1>; status =3D "disabled"; }; + + cru: clock-controller@f8801000 { + compatible =3D "anlogic,dr1v90-cru"; + reg =3D <0x0 0xf8801000 0 0x400>; + clocks =3D <&osc_33m>, <&can_ext>, <&wdt_ext>; + clock-names =3D "osc_33m", "can_ext", "wdt_ext"; + #clock-cells =3D <1>; + #reset-cells =3D <1>; + }; }; }; --=20 2.51.0