From nobody Wed Dec 17 18:12:58 2025 Received: from sender4-op-o12.zoho.com (sender4-op-o12.zoho.com [136.143.188.12]) (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 B3E153B8D77; Tue, 16 Dec 2025 03:46:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765856807; cv=pass; b=gUNftEtm2pvAI+pEsn7kprwv86HY8EeqfCXuYMcqlLvF+A3uqUkmYlW/b73vWOXTl3X63iXZYgWcki+14gLbCoHC28DW2KTZBsmUcbFfCYPLVszD0NKk+Gf5+3goZpHFGmMq8kmylDe/sUG/sfKT/IGBoR0PSX8ueHdGuPV1wEE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765856807; c=relaxed/simple; bh=U6Koewa3ToGVhTuDIa0v9BciWTIN+kAaknVqSU9Al/Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UuP5l6gR1je3ZkHNnO2PvOkw1tOOdo0jFZ81KX97vgd4PX0QjGDG+772+HuQXjdzHWkK/XeoWSBDxm/0PxaqaBjAbq6ytvJusgKQyrRwvARTXvlpDRN1VZKBlovgpeOB8v0osnHgENdeWkIAYmFTtbpaZ8YOZ+5Wt7UUDgOVkfI= 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=Bj404qBv; arc=pass smtp.client-ip=136.143.188.12 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="Bj404qBv" ARC-Seal: i=1; a=rsa-sha256; t=1765856780; cv=none; d=zohomail.com; s=zohoarc; b=ngrer83y2UhQ9LkYF5OxqIHo0oS/4Odx9msBOJCj+WZ90FUwiajYzTHkqejmYWxC5cbWATSK5L6Wcl1Tqbqp1ftHFD+mPWqlK6d7aoD2s8cfH4QCSfkGAhqseq7e1GDAxhmM4gaqqozdRwRvuwPb0ZWiBjccN+5zf7JS6+xzQRA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1765856780; 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=qqyZoKN1UsOMI2CBQ5W9TknPxhID6l57//deLC3J3wU=; b=UGitHZBaSAwp2tPCi3BDahLxciBm6l6EdYPjUBttbNi6dzLWnHTlJaPilLMhICNdsqUceRD8NGNaeNlc92AU2E4chLTbWS+1njr7ifq/FsgpBN5lxtrhwxTNbY+GlGwL/Z2jAzacMnc0JVs50oUG8c4ob5p3i5GXn1RHThnyzMM= 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=1765856780; 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=qqyZoKN1UsOMI2CBQ5W9TknPxhID6l57//deLC3J3wU=; b=Bj404qBvZwDt3y5rQxfPzLA6KbgJDyoM1cWma8zgMF8AcP3qAk2WAy8iHg3oOZ+t kZioT9nUHhW/xKgOMfmhcWyl8x1MHxUgrSpQwIKI9WXS56rglYZc68Aq2lBwwikC5Cu P88OcH67O7MK3w5T/+ShCDLMHiCfQeP/vYVZpI/o= Received: by mx.zohomail.com with SMTPS id 1765856778639683.4460283002935; Mon, 15 Dec 2025 19:46:18 -0800 (PST) From: Junhui Liu Date: Tue, 16 Dec 2025 11:39:41 +0800 Subject: [PATCH v3 1/6] 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: <20251216-dr1v90-cru-v3-1-52cc938d1db0@pigmoral.tech> References: <20251216-dr1v90-cru-v3-0-52cc938d1db0@pigmoral.tech> In-Reply-To: <20251216-dr1v90-cru-v3-0-52cc938d1db0@pigmoral.tech> To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Philipp Zabel , Junhui Liu , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, devicetree@vger.kernel.org, Troy Mitchell X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1765856765; l=1263; i=junhui.liu@pigmoral.tech; s=20250910; h=from:subject:message-id; bh=U6Koewa3ToGVhTuDIa0v9BciWTIN+kAaknVqSU9Al/Q=; b=cbJ40hyHxLUKuvui6NA3kRi5QecXXmnrl8qI8J+hxP5Af6TB+OguIa9aQZ1sMULIPiwp+BPBp U1pGH3FrSJxBWS1J+w60N5WLgJSBUYUDRadFG3XhbHV5tmIiAYZRVWU 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. Reviewed-by: Troy Mitchell Signed-off-by: Junhui Liu --- 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.52.0 From nobody Wed Dec 17 18:12:58 2025 Received: from sender4-op-o12.zoho.com (sender4-op-o12.zoho.com [136.143.188.12]) (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 293E0265632; Tue, 16 Dec 2025 03:46:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765856807; cv=pass; b=Pre/HypGuLSiIQVBBhYwDcYz6Md7jYb/rCKYhTCmRGabAgtKKvP4gOqV4IbiPWJYLrYoHWXlM8NbJgfohW+37S25zSJD97vUEcxX6peQpltEXJAs6l+CVxIJwTUS4/iwALkCqZkjJSStAK3zn+7KD6SXlMisqnmDbghzYkjSmqI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765856807; c=relaxed/simple; bh=ALpitnnLzJTc1MzTgQ2H8DGRaqnG8rx6bQ5zk8Xl2O8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OXyNYDsUufNqQ6eReC5e/hAaIQ2NjNJzMtqqkTUKfeg7O1xdBI4bFMNDTohWPBcq+rr3YA/6qcc2ryZUi8P97nEfaVe0Xupdr9SYzA8VmVh633JZFu6xR9Q4cbqaE6ZY978dPgjn3ACKuk+xF6Cc2zj6GUadBtMgERPN9ftLdek= 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=hjA2nAQH; arc=pass smtp.client-ip=136.143.188.12 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="hjA2nAQH" ARC-Seal: i=1; a=rsa-sha256; t=1765856786; cv=none; d=zohomail.com; s=zohoarc; b=Ipw0SjPs/+ZaxA9RNcbRPDPdNWITUkg4iR5jYne/ZCt039Lvz+Oa6wj4bzaJtzjXzFG0AhXXMrgRe4hVEDwiPv96QarMhWe2c60OMoRi3zqYSXNhDWzEaSM3wFZZ91lWF4LeOtHSVIE13oRd3oVgY1UAGtL5oDF0R1oR0zki59I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1765856786; 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=ILbL4CVlKIJmH7YalADTkioP1Q0SfdtkN/e5ADTMbaE=; b=g6gARh9JlLGIA8iSKgbkAfkYe2GL79b4wwIK06zCVxZK3HBO3HzYhRurCp6uAV0/x0dcZ1OvkcQMbrX9gesbFxQXRf1m8N/+KBnYhxhoOzNs8kFEhtXppCD5mTIRvHaP/EJwJ22soLYgAhnXPXOlqBAtfDOGdx7GDf8X5vMwk8E= 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=1765856786; 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=ILbL4CVlKIJmH7YalADTkioP1Q0SfdtkN/e5ADTMbaE=; b=hjA2nAQHtvwsXX/Tc3IfHW0MZ45NPdpMimRdRZZHNudFsig7tbXMR/YnHpSBFy70 UzTOAJLsP4bAkz5IOnO/N/45ex7OzIsUf2o4v9X8A364LQVY332Us10EuyDWY45Ljqn 09AoguNgiF9kt/UXCf9tYPl7sc32mVu+HAqH9yFw= Received: by mx.zohomail.com with SMTPS id 1765856785611547.9393815748379; Mon, 15 Dec 2025 19:46:25 -0800 (PST) From: Junhui Liu Date: Tue, 16 Dec 2025 11:39:42 +0800 Subject: [PATCH v3 2/6] 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: <20251216-dr1v90-cru-v3-2-52cc938d1db0@pigmoral.tech> References: <20251216-dr1v90-cru-v3-0-52cc938d1db0@pigmoral.tech> In-Reply-To: <20251216-dr1v90-cru-v3-0-52cc938d1db0@pigmoral.tech> To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Philipp Zabel , Junhui Liu , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, devicetree@vger.kernel.org, Conor Dooley X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1765856765; l=5234; i=junhui.liu@pigmoral.tech; s=20250910; h=from:subject:message-id; bh=ALpitnnLzJTc1MzTgQ2H8DGRaqnG8rx6bQ5zk8Xl2O8=; b=XxYkN41uxIs6la8TNt0l+S196xv0qPiFPnhpnoC2KCT6bsOGez5cKvM+WqPwk13gVY/tG+JXb NjODhJjvuoeDm/ane6t59uKE6618kfjIMI2Mb1ZQB0skMrQFiL/4xFu 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. Reviewed-by: Conor Dooley Signed-off-by: Junhui Liu --- .../bindings/clock/anlogic,dr1v90-cru.yaml | 60 ++++++++++++++++++= ++++ include/dt-bindings/clock/anlogic,dr1v90-cru.h | 46 +++++++++++++++++ include/dt-bindings/reset/anlogic,dr1v90-cru.h | 41 +++++++++++++++ 3 files changed, 147 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..664daf3946a7bc5812f03ac0260= 81027690bc562 --- /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) 2024-2025 Anlogic, Inc. + * 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..c5b7aae1ab6ac7b931c35e52615= 991afdfe43b08 --- /dev/null +++ b/include/dt-bindings/reset/anlogic,dr1v90-cru.h @@ -0,0 +1,41 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +/* + * 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.52.0 From nobody Wed Dec 17 18:12:58 2025 Received: from sender4-op-o12.zoho.com (sender4-op-o12.zoho.com [136.143.188.12]) (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 C09DB279903; Tue, 16 Dec 2025 03:46:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765856814; cv=pass; b=EEIZB8eV/5MV+biumCaOCRf3VX5MF2HOTSWbdYo71+e/kZoGqlYUf3IK8jYbrsPvEs/1ygcrrueYIMeGqpO0a13UrxLCqSbjHn/5BiLYlU6xnBzJ0z8cmJhDe9NC1P79zPBmKFYtBS3zAAUnOWMspDpayPKqxCAJcQ5TYVUrHaA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765856814; c=relaxed/simple; bh=LIlz5S0vK8EP5HgraOlRqVcYzsRuvr1lbtQvBFDhgJw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=s1I8GzhKlRE2CE3ouN+qkv/bVmVwCeMqNXbruFhxGWIsDd/6FymRBfWfQ8yGGaXzV5wKZ1iapdvqLEqZY3z3HhlxPZFfbfdZU9TBSK9YU6mlzE57nE2+xzU4mN4QqDlO42TPmzXlnkVfnwIl0fC5UhPdJJZvjh7ZWhOCMh4o6JE= 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=SZNKL5YC; arc=pass smtp.client-ip=136.143.188.12 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="SZNKL5YC" ARC-Seal: i=1; a=rsa-sha256; t=1765856794; cv=none; d=zohomail.com; s=zohoarc; b=de+V/TWQNmXPCfIL8zeAgYeN+sQnfrnZ8gVL02C7cCawkBuNXP1GREVT+KR4QhxI8E/uCuTdANRS9dD1QqlpWetKKfCrOmc6+SWPTDyOu6qm9/KC4U3AUCekWm8rHtMm1StZ3+r7lJEg+/51PTtStz6mVYANe2WV0w+iKtHFrnw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1765856794; 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=kckKtq0+0kiB0audbQRxYu7f7gRtXsTElKwKdLH98y0=; b=Hc31BM3NQgnQSHef9DzfNi//vZcQPwqPu+zX4QVAfl/HbKMEcdIhicCbPAH4ppXAg9dHxW4xhbkzMbPh/+E6XI+XUGuBYdXMdJUyKw6I31Snibn4JuC6dgxLQECxAOzf3CAx78chBv6+YokjgMWtUwmY2+cVmH5Pdy92MxbETl4= 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=1765856794; 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=kckKtq0+0kiB0audbQRxYu7f7gRtXsTElKwKdLH98y0=; b=SZNKL5YC7grlsgaCsV5/PucYqPtqBC24xKe38/WvnTcvJUKUSl6R53Hg2r4zbylx jOwdFmUrNGxxSewrTSYPpYWOIXVFRxfUwgZ42PTLn+IDTPVJgIE1KGlIAXG1T3AfLtu YMkH3XLL/Vov9kqPuH0hGXpz4WeEOBXZKcP7ncw4= Received: by mx.zohomail.com with SMTPS id 1765856793496127.17603172423651; Mon, 15 Dec 2025 19:46:33 -0800 (PST) From: Junhui Liu Date: Tue, 16 Dec 2025 11:39:43 +0800 Subject: [PATCH v3 3/6] 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: <20251216-dr1v90-cru-v3-3-52cc938d1db0@pigmoral.tech> References: <20251216-dr1v90-cru-v3-0-52cc938d1db0@pigmoral.tech> In-Reply-To: <20251216-dr1v90-cru-v3-0-52cc938d1db0@pigmoral.tech> To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Philipp Zabel , Junhui Liu , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, devicetree@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1765856765; l=22093; i=junhui.liu@pigmoral.tech; s=20250910; h=from:subject:message-id; bh=LIlz5S0vK8EP5HgraOlRqVcYzsRuvr1lbtQvBFDhgJw=; b=Ksamn71hW/O+Gvcsuy90MeJ8t0XjJtP1OdDX09vO8f9QfEq5eu1VuyAGjZTzuQXgSAGL2d7Q0 kB5jaO/IbJqCiUADRi8hL2W/ODI4tqa9YW0aTtUltsVGMUeAOWc2mk0 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 | 191 +++++++++++++++++++++++++++++ drivers/clk/anlogic/cru_dr1.c | 258 +++++++++++++++++++++++++++++++++++= ++++ drivers/clk/anlogic/cru_dr1.h | 117 ++++++++++++++++++ 7 files changed, 582 insertions(+) diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig index 3a1611008e48e9bc54f07e273db16e2e7cd1f130..b61d6c799bc735f0d0c7aac05a9= df4944b101de3 100644 --- a/drivers/clk/Kconfig +++ b/drivers/clk/Kconfig @@ -513,6 +513,7 @@ config COMMON_CLK_RPMI =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 61ec08404442b4715dc84a563b3330cb5169f8b2..4eea2736f468bdc7cbecdb1f994= bb6cde4fe8088 100644 --- a/drivers/clk/Makefile +++ b/drivers/clk/Makefile @@ -114,6 +114,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..bb9ffc6e68ab7022ffbdb8776fb= 34f28ca6a0b5c --- /dev/null +++ b/drivers/clk/anlogic/cru-dr1v90.c @@ -0,0 +1,191 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2024-2025 Anlogic, Inc. + * 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("Fushan Zeng "); +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..0c7fd5e2abe5c347902c91ef846= 576f086a32e8c --- /dev/null +++ b/drivers/clk/anlogic/cru_dr1.c @@ -0,0 +1,258 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2024-2025 Anlogic, Inc. + * 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_is_enabled(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; + 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..5007811eeb81f37db60bdeed41d= 7cea81e37a1b2 --- /dev/null +++ b/drivers/clk/anlogic/cru_dr1.h @@ -0,0 +1,117 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (C) 2024-2025 Anlogic, Inc. + * 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.52.0 From nobody Wed Dec 17 18:12:58 2025 Received: from sender4-op-o12.zoho.com (sender4-op-o12.zoho.com [136.143.188.12]) (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 9C60D284B26; Tue, 16 Dec 2025 03:46:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765856817; cv=pass; b=lCmpC90mIiTtTUuct+cdDaM0EW/tsdmJSQpSeUlTkeoCEfDfsQYXKEszx/QurbhThmXAZHPqgOurN7+vAoho/rpcUvN8rf7EKKjUbg3p1tgob8LZKqB5yWZCyNfE7IXCuVCz8ZsBpkTj+3j0s3pA6quPk04L/PyNHEL2ZhK6hMo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765856817; c=relaxed/simple; bh=tfsY0yVqMtvwZ458fh6j7kraZS5lT+eBjVFMQZYRvnc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oeYM+wKZ1iTqMsFLbQHIyorZ3R8seR/T1ZPRpG+cFtG1iEfMfaBcMxETrzm/4TwiGZeLb+Oc7P4G46hagHXGtzq5EFuWzU4JGNX2nJuPcYamYeRfXU7o6ct8J+oSVUck0eUoylKl1f12f9o5cFDQIKWcMma8w/iUPBd4x1w1cY0= 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=CTBnOxBS; arc=pass smtp.client-ip=136.143.188.12 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="CTBnOxBS" ARC-Seal: i=1; a=rsa-sha256; t=1765856801; cv=none; d=zohomail.com; s=zohoarc; b=PXo4V+gS/2tAM69u+ydLvplVP6zo90czP/gPb3Y7EF6r+nPFFZ2O5fb6mvCGVBGUIv7kczoraWaNUC135XrbbhlhMpzlkGHeObmQ4jrM/lB8CMEc6M5JvO1m9cYwMvtu+pttS3MXDHmhS4MTi+zStR+rUVMDhg0r4jPC67C2t+4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1765856801; 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=AiupJZd/vcY7o8scBXZAtdz3Y8DTB8H2FBtmaYjx7+Y=; b=TGeAa1+/CRDBdAk6W0BNBSdmKyoJBZY0JyiaV39s0ANjDMBinnT2kr2NaKZmq0bTGY8pqqxjLAq1pMhxbPLnRur95TA4oVYpgO7/vBBbNuna9bt8gBARLWhFN/O8U0sILspFwOQGB8XnuBCBFhWgAxwNsMjD9WXokJ/BKowKZ2g= 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=1765856801; 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=AiupJZd/vcY7o8scBXZAtdz3Y8DTB8H2FBtmaYjx7+Y=; b=CTBnOxBSsCICtN4i1pJBY6sJM9hqs0hZdXWy39pZZqdcEZ2my4dKmgltzTr6pUxt iZFJ+xppaw82Bfifwa4/NvxtO/TTDp9T2076IFr3E0U12FW2T7Dxug2EhZVsVLIMfcv WydL9YCNkdjWLvpxDgRF8e2zIHk2MNhboWOfsTKk= Received: by mx.zohomail.com with SMTPS id 1765856799899114.29961420362406; Mon, 15 Dec 2025 19:46:39 -0800 (PST) From: Junhui Liu Date: Tue, 16 Dec 2025 11:39:44 +0800 Subject: [PATCH v3 4/6] 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: <20251216-dr1v90-cru-v3-4-52cc938d1db0@pigmoral.tech> References: <20251216-dr1v90-cru-v3-0-52cc938d1db0@pigmoral.tech> In-Reply-To: <20251216-dr1v90-cru-v3-0-52cc938d1db0@pigmoral.tech> To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Philipp Zabel , Junhui Liu , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, devicetree@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1765856765; l=6260; i=junhui.liu@pigmoral.tech; s=20250910; h=from:subject:message-id; bh=tfsY0yVqMtvwZ458fh6j7kraZS5lT+eBjVFMQZYRvnc=; b=lijSNI7pCRFqkf4yE8Cwg15oX5IivMMlWpYY9dax+5p3igSwhX365hneekHQpTE6Mgmit8ce5 MJlXoyke1rCAg+zxDbOqe0ehwbVyA1TKf1bfb5ZtYPWiGC07muD2rDM 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 | 141 +++++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 151 insertions(+) diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig index 6e5d6deffa7d367040b0b380b78ce02d775a3a63..be45de8b1681578dfd511bafd19= 73699aa95358b 100644 --- a/drivers/reset/Kconfig +++ b/drivers/reset/Kconfig @@ -73,6 +73,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_EIC7700 bool "Reset controller driver for ESWIN SoCs" depends on ARCH_ESWIN || COMPILE_TEST diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile index 9c3e484dfd81a4f7b2f156a6226d5fa233600f9f..2e6804ff463e5e1da3b697373d5= 6ace1351125af 100644 --- a/drivers/reset/Makefile +++ b/drivers/reset/Makefile @@ -13,6 +13,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_EIC7700) +=3D reset-eic7700.o obj-$(CONFIG_RESET_EYEQ) +=3D reset-eyeq.o obj-$(CONFIG_RESET_GPIO) +=3D reset-gpio.o diff --git a/drivers/reset/reset-dr1v90.c b/drivers/reset/reset-dr1v90.c new file mode 100644 index 0000000000000000000000000000000000000000..7be8536b16c1ead1121390f4f74= 53ad6f2927982 --- /dev/null +++ b/drivers/reset/reset-dr1v90.c @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2025 Junhui Liu + */ + +#include +#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; + spinlock_t lock; /* protect register read-modify-write */ +}; + +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; + + guard(spinlock_irqsave)(&rstc->lock); + + 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; + + spin_lock_init(&rstc->lock); + + 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.52.0 From nobody Wed Dec 17 18:12:58 2025 Received: from sender4-op-o12.zoho.com (sender4-op-o12.zoho.com [136.143.188.12]) (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 89BD52F39A9; Tue, 16 Dec 2025 03:46:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765856821; cv=pass; b=RSKXoellerCN1NRTSnzXlV2//LkgQk9syEIBMVvXARIYURQLoOiLpT3lLOpPKHqRA1js5YZ5BY/08cVjUlZAdfEptMmKBbIz3j1WhUtmU3k4LokRWM/O7nv+fnx7egn99UV/Q9GNQAry4gH8VhzNOQGOhnIo7PCHPaiAjWrA7hs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765856821; c=relaxed/simple; bh=Tc9wfJN4uUK4cpcgXU6HieZ4TYiHQqyYO+rTHJRnSfg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pYSAfuyTJSJYWh0BR362LMrDE10Yy/URb9zG3og8VfymROP8cL2a9Ek/ycdDt6Mlfqdfzo2SQWj35/hln3j70QCzXTQEniGjrIB9DbDd1EpsLBuOr5h2pks2wnAUXoH/1IWOObXkVScXXbmXWmjpJ+252lwhNDg7LBWrt/l8wRY= 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=DRWXUoGV; arc=pass smtp.client-ip=136.143.188.12 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="DRWXUoGV" ARC-Seal: i=1; a=rsa-sha256; t=1765856806; cv=none; d=zohomail.com; s=zohoarc; b=QACyZTckW1aHY0tnYQsZOIc8xnmafWiKM38FPkwYwyPnX7218+9utofKVhwDBWFHiiq+nYCa+3eO2KzY0BMBwndrmKOD0r3KpUmEADOq5CHgtrQVjGBTUKzyt2A+McjodQtwLKcXBbTY0ClURrTcyBgCnJEB/EuIfo7f1k7SeKk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1765856806; 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=QfvDgfQAhmcyG3FI0g9kzjBmrgM3l9ZEjOo7B7u/mNg=; b=nJhWPNowN3koFA4n5RxJqEICs3xgeIoTRty8pPMvZBDJMLbgRTghcc9BCCcLlqDg6F+uK7N9mD8FXLQanmklSqtrB5mOXV1U4vNfMU6OaftmAo0r/HxuL5TrF3581UvjHg5xQTyeugkREeUd4WKRv9sXC5gJyOi4z3Nphk9ARxI= 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=1765856806; 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=QfvDgfQAhmcyG3FI0g9kzjBmrgM3l9ZEjOo7B7u/mNg=; b=DRWXUoGVvpEhHSl+4XR0xfeeOAij3J31U/REfQhbU0kELjtIW/fiSEzqw+vvN6cx zXNCUWVNcq3G+f1ZLDccUjBJXkgekdoxDc6HJ3E4wedkoq6O5khO5X6et1aItMckkvs Zr/Wr8taow9npmrFpNCAROW1Tr4yaiJpK0YxspbY= Received: by mx.zohomail.com with SMTPS id 1765856805836609.2640014637352; Mon, 15 Dec 2025 19:46:45 -0800 (PST) From: Junhui Liu Date: Tue, 16 Dec 2025 11:39:45 +0800 Subject: [PATCH v3 5/6] 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: <20251216-dr1v90-cru-v3-5-52cc938d1db0@pigmoral.tech> References: <20251216-dr1v90-cru-v3-0-52cc938d1db0@pigmoral.tech> In-Reply-To: <20251216-dr1v90-cru-v3-0-52cc938d1db0@pigmoral.tech> To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Philipp Zabel , Junhui Liu , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, devicetree@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1765856765; l=2784; i=junhui.liu@pigmoral.tech; s=20250910; h=from:subject:message-id; bh=Tc9wfJN4uUK4cpcgXU6HieZ4TYiHQqyYO+rTHJRnSfg=; b=ZG9rNNI7EugakE68kwueMMjJgKbCmtSNAKCLpsvLu1d9ktEI82/3Qe8WooLIjOtIqZNhlPYAb Oh+as+XptGKBM0OJUS/5JNdxgUAl79Eo/39EdL+XzXhvFkMGOz7Lpzt 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 a5d0765ade3231ece0afbe8835d95cd918a44ad9..dc8358b3575124234f984c44854= 7493d063e991f 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>; @@ -80,21 +104,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.52.0 From nobody Wed Dec 17 18:12:58 2025 Received: from sender4-op-o12.zoho.com (sender4-op-o12.zoho.com [136.143.188.12]) (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 EA6AE279DAE; Tue, 16 Dec 2025 03:47:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765856829; cv=pass; b=ldXYKj3cCWdxumQqo+TmIZpIhLtFOVQJAz7Z9yNnfXsehCFV9UX9V2OoaFBX1253gx4lODotjqkffEGrwOjHfoggvtLYGHS8/GhljL/9YdTlqVb3k4nYxL8BQnJ2Ov5oIyp5igmgL6nAQKuV8OYIWyr5WtGXEf8Mab71Vi5EFyM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765856829; c=relaxed/simple; bh=sFArHp8MxTT//WO8noDWEOyCEAt8z/zx+uO9S3+romA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UM9qcdnQB5C3H7+noEhAjU+wUSn7UTw1fAeyZn1c6iJh2W0a8xxJAwHL16lBkJpYjlxOvF7FQj7OFEPkt++tI6f4CgdxThiAouIXr9jXOcDM9/CJ3C1aa+xhAhq8oE6RDLrNMkr0nK2DeUYkDHFcyr80wnLGnoCjrer5YKxAyR4= 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=D83RnUHu; arc=pass smtp.client-ip=136.143.188.12 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="D83RnUHu" ARC-Seal: i=1; a=rsa-sha256; t=1765856813; cv=none; d=zohomail.com; s=zohoarc; b=Z2dKmtO2ATHJFwnFhiqKHJBC2VDL6z5LvMSfklStHM/4T3gwfQR+lP1kHbrwapHBcrKEgH3xwGpwexui+z9cDU/SLCMmZMgUaxyxPHQhubwSh3ft/JnF0SaAIB1K3eGxwJkgBnDfAFsr1nkDoBD04WT82bRef5hZMw7RbS9/SSM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1765856813; 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=Ug+ZDoA4Rf5aQ/L3KHfd427l87YDPU42ReTHvUHZ8eI=; b=R/M7YKxD+FzeGOZOEcnxAIh9Vh8RyRKj9Ze6JrFj4Tf+HNvX1tB5PPRuKsTJCXY/hQM7LbnO1m2c6+TC719oWGbsxA44ACZNPw8O8CFfpBYnuL+1IGJzzba6pKhITXTIvEdpTzCK/sfB4WuI95S8YKf2Z7NlwsK087TMPRuwLLs= 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=1765856813; 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=Ug+ZDoA4Rf5aQ/L3KHfd427l87YDPU42ReTHvUHZ8eI=; b=D83RnUHu5zapNG1/J+8VXR4ZpHiurHSa0xbecZXNY/xXgoZCCBoOaPio43cSBT5Y CUnid6R2AmvXfdrdW2aGRHqQFOmrsj3kKKep5PsgPJTjdW0M18Ym4xJfL2MnazI7YlF 3IsDUTmZ7fTw+4I3tzxncIB8xIR4Oh/zb30ipUS0= Received: by mx.zohomail.com with SMTPS id 1765856811386140.78787853841845; Mon, 15 Dec 2025 19:46:51 -0800 (PST) From: Junhui Liu Date: Tue, 16 Dec 2025 11:39:46 +0800 Subject: [PATCH v3 6/6] MAINTAINERS: Add entry for Anlogic DR1V90 SoC drivers 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: <20251216-dr1v90-cru-v3-6-52cc938d1db0@pigmoral.tech> References: <20251216-dr1v90-cru-v3-0-52cc938d1db0@pigmoral.tech> In-Reply-To: <20251216-dr1v90-cru-v3-0-52cc938d1db0@pigmoral.tech> To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Philipp Zabel , Junhui Liu , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, devicetree@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1765856765; l=759; i=junhui.liu@pigmoral.tech; s=20250910; h=from:subject:message-id; bh=sFArHp8MxTT//WO8noDWEOyCEAt8z/zx+uO9S3+romA=; b=byowsbfcpmQVLRa60RaakgxIYq3+FbPv/WhkvWluy9LNYXVUAxemKPz93OapxIy4vS/7MCtqu ISXYnipt55nDcNJjmzWywkWrJRCn67AmmTZZHslc8f3OJOQSXOrbw3d X-Developer-Key: i=junhui.liu@pigmoral.tech; a=ed25519; pk=cgATWSU1KfGWmdwNmkPyHGnWgofhqqhE8Vts58wyxe4= X-ZohoMailClient: External Add myself as maintainer of Anlogic DR1V90 SoC drivers. Signed-off-by: Junhui Liu --- MAINTAINERS | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 5b11839cba9de1e9e43f63787578edd8c429ca39..3aab1ee3e2864397fbf510ec506= a0fa498588e99 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1841,6 +1841,13 @@ M: Jiaxun Yang S: Supported F: drivers/rtc/rtc-goldfish.c =20 +ANLOGIC DR1V90 SOC DRIVERS +M: Junhui Liu +L: linux-riscv@lists.infradead.org +S: Maintained +N: dr1v90 +K: dr1v90 + AOA (Apple Onboard Audio) ALSA DRIVER M: Johannes Berg L: linuxppc-dev@lists.ozlabs.org --=20 2.52.0