* [PATCH 0/3] Add support for Cix Sky1 resets
@ 2025-11-07 3:38 Gary Yang
2025-11-07 3:38 ` [PATCH 1/3] dt-bindings: reset: add sky1 reset controller Gary Yang
` (2 more replies)
0 siblings, 3 replies; 17+ messages in thread
From: Gary Yang @ 2025-11-07 3:38 UTC (permalink / raw)
To: p.zabel, robh, krzk+dt, conor+dt
Cc: devicetree, linux-kernel, linux-arm-kernel, cix-kernel-upstream,
Gary Yang
Patch 1: Add yaml file for Cix Sky1 resets
Patch 2: Add driver codes for Cix Sky1 resets
Patch 3: Add dts nodes for Cix Sky1 resets
Gary Yang (3):
dt-bindings: reset: add sky1 reset controller
Reset: cix: add support for cix sky1 resets
dts: reset: add support for cix sky1 resets
.../bindings/reset/cix,sky1-rst.yaml | 48 +++
arch/arm64/boot/dts/cix/sky1.dtsi | 14 +
drivers/reset/Kconfig | 7 +
drivers/reset/Makefile | 1 +
drivers/reset/reset-sky1.c | 403 ++++++++++++++++++
include/dt-bindings/reset/cix,sky1-rst-fch.h | 45 ++
include/dt-bindings/reset/cix,sky1-rst.h | 167 ++++++++
7 files changed, 685 insertions(+)
create mode 100644 Documentation/devicetree/bindings/reset/cix,sky1-rst.yaml
create mode 100644 drivers/reset/reset-sky1.c
create mode 100644 include/dt-bindings/reset/cix,sky1-rst-fch.h
create mode 100644 include/dt-bindings/reset/cix,sky1-rst.h
--
2.49.0
^ permalink raw reply [flat|nested] 17+ messages in thread* [PATCH 1/3] dt-bindings: reset: add sky1 reset controller 2025-11-07 3:38 [PATCH 0/3] Add support for Cix Sky1 resets Gary Yang @ 2025-11-07 3:38 ` Gary Yang 2025-11-07 7:17 ` Krzysztof Kozlowski 2025-11-07 13:25 ` Philipp Zabel 2025-11-07 3:38 ` [PATCH 2/3] Reset: cix: add support for cix sky1 resets Gary Yang 2025-11-07 3:38 ` [PATCH 3/3] dts: reset: " Gary Yang 2 siblings, 2 replies; 17+ messages in thread From: Gary Yang @ 2025-11-07 3:38 UTC (permalink / raw) To: p.zabel, robh, krzk+dt, conor+dt Cc: devicetree, linux-kernel, linux-arm-kernel, cix-kernel-upstream, Gary Yang There are two reset controllers on Cix sky1 Soc. One is located in S0 domain, and the other is located in S5 domain. Signed-off-by: Gary Yang <gary.yang@cixtech.com> --- .../bindings/reset/cix,sky1-rst.yaml | 48 +++++ include/dt-bindings/reset/cix,sky1-rst-fch.h | 45 +++++ include/dt-bindings/reset/cix,sky1-rst.h | 167 ++++++++++++++++++ 3 files changed, 260 insertions(+) create mode 100644 Documentation/devicetree/bindings/reset/cix,sky1-rst.yaml create mode 100644 include/dt-bindings/reset/cix,sky1-rst-fch.h create mode 100644 include/dt-bindings/reset/cix,sky1-rst.h diff --git a/Documentation/devicetree/bindings/reset/cix,sky1-rst.yaml b/Documentation/devicetree/bindings/reset/cix,sky1-rst.yaml new file mode 100644 index 000000000000..72de480b064c --- /dev/null +++ b/Documentation/devicetree/bindings/reset/cix,sky1-rst.yaml @@ -0,0 +1,48 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/reset/cix,sky1-rst.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: CIX Sky1 Reset Controller + +maintainers: + - Gary Yang <gary.yang@cixtech.com> + +description: | + CIX Sky1 reset controller can be used to reset various set of peripherals. + There are two reset controllers, one is located in S0 domain, the other + is located in S5 domain. + + See also: + - dt-bindings/reset/cix,sky1-rst.h + +properties: + compatible: + items: + - enum: + - cix,sky1-rst + - cix,sky1-rst-fch + - const: syscon + + reg: + maxItems: 2 + + '#reset-cells': + const: 1 + +required: + - compatible + - reg + - '#reset-cells' + +additionalProperties: false + +examples: + - | + #include <dt-bindings/reset/cix,sky1-rst.h> + reset-controller@16000000 { + compatible = "cix,sky1-rst", "syscon"; + reg = <0x0 0x16000000 0x0 0x1000>; + #reset-cells = <1>; + }; diff --git a/include/dt-bindings/reset/cix,sky1-rst-fch.h b/include/dt-bindings/reset/cix,sky1-rst-fch.h new file mode 100644 index 000000000000..08c43bd64cf1 --- /dev/null +++ b/include/dt-bindings/reset/cix,sky1-rst-fch.h @@ -0,0 +1,45 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +/* Author: Jerry Zhu <jerry.zhu@cixtech.com> */ +#ifndef DT_BINDING_RESET_FCH_SKY1_H +#define DT_BINDING_RESET_FCH_SKY1_H + +/* func reset for sky1 fch */ + +#define SW_I3C0_RST_FUNC_G_N 0 +#define SW_I3C0_RST_FUNC_I_N 1 +#define SW_I3C1_RST_FUNC_G_N 2 +#define SW_I3C1_RST_FUNC_I_N 3 +#define SW_UART0_RST_FUNC_N 4 +#define SW_UART1_RST_FUNC_N 5 +#define SW_UART2_RST_FUNC_N 6 +#define SW_UART3_RST_FUNC_N 7 +#define SW_TIMER_RST_FUNC_N 8 + +/* apb reset for sky1 fch */ +#define SW_I3C0_RST_APB_N 9 +#define SW_I3C1_RST_APB_N 10 +#define SW_DMA_RST_AXI_N 11 +#define SW_UART0_RST_APB_N 12 +#define SW_UART1_RST_APB_N 13 +#define SW_UART2_RST_APB_N 14 +#define SW_UART3_RST_APB_N 15 +#define SW_SPI0_RST_APB_N 16 +#define SW_SPI1_RST_APB_N 17 +#define SW_I2C0_RST_APB_N 18 +#define SW_I2C1_RST_APB_N 19 +#define SW_I2C2_RST_APB_N 20 +#define SW_I2C3_RST_APB_N 21 +#define SW_I2C4_RST_APB_N 22 +#define SW_I2C5_RST_APB_N 23 +#define SW_I2C6_RST_APB_N 24 +#define SW_I2C7_RST_APB_N 25 +#define SW_GPIO_RST_APB_N 26 + +/* fch rst for xspi */ +#define SW_XSPI_REG_RST_N 27 +#define SW_XSPI_SYS_RST_N 28 + +#define SKY1_FCH_RESET_NUM 29 + +#endif + diff --git a/include/dt-bindings/reset/cix,sky1-rst.h b/include/dt-bindings/reset/cix,sky1-rst.h new file mode 100644 index 000000000000..232d59f0fb25 --- /dev/null +++ b/include/dt-bindings/reset/cix,sky1-rst.h @@ -0,0 +1,167 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +/* Author: Jerry Zhu <jerry.zhu@cixtech.com> */ +#ifndef DT_BINDING_RESET_SKY1_H +#define DT_BINDING_RESET_SKY1_H + +/* reset for csu_pm */ + +#define SKY1_CSU_PM_RESET_N 0 +#define SKY1_SENSORHUB_RESET_N 1 +#define SKY1_SENSORHUB_NOC_RESET_N 2 + +/* reset group0 for s0 domain modules */ +#define SKY1_DDRC_RESET_N 3 +#define SKY1_GIC_RESET_N 4 +#define SKY1_CI700_RESET_N 5 +#define SKY1_SYS_NI700_RESET_N 6 +#define SKY1_MM_NI700_RESET_N 7 +#define SKY1_PCIE_NI700_RESET_N 8 +#define SKY1_GPU_RESET_N 9 +#define SKY1_NPUTOP_RESET_N 10 +#define SKY1_NPUCORE0_RESET_N 11 +#define SKY1_NPUCORE1_RESET_N 12 +#define SKY1_NPUCORE2_RESET_N 13 +#define SKY1_VPU_RESET_N 14 +#define SKY1_ISP_SRESET_N 15 +#define SKY1_ISP_ARESET_N 16 +#define SKY1_ISP_HRESET_N 17 +#define SKY1_ISP_GDCRESET_N 18 +#define SKY1_DPU_RESET0_N 19 +#define SKY1_DPU_RESET1_N 20 +#define SKY1_DPU_RESET2_N 21 +#define SKY1_DPU_RESET3_N 22 +#define SKY1_DPU_RESET4_N 23 +#define SKY1_DP_RESET0_N 24 +#define SKY1_DP_RESET1_N 25 +#define SKY1_DP_RESET2_N 26 +#define SKY1_DP_RESET3_N 27 +#define SKY1_DP_RESET4_N 28 +#define SKY1_DP_PHY_RST_N 29 + +/* reset group1 for s0 domain modules */ +#define SKY1_AUDIO_HIFI5_RESET_N 30 +#define SKY1_AUDIO_HIFI5_NOC_RESET_N 31 +#define SKY1_CSIDPHY_PRST0_N 32 +#define SKY1_CSIDPHY_CMNRST0_N 33 +#define SKY1_CSI0_RST_N 34 +#define SKY1_CSIDPHY_PRST1_N 35 +#define SKY1_CSIDPHY_CMNRST1_N 36 +#define SKY1_CSI1_RST_N 37 +#define SKY1_CSI2_RST_N 38 +#define SKY1_CSI3_RST_N 39 +#define SKY1_CSIBRDGE0_RST_N 40 +#define SKY1_CSIBRDGE1_RST_N 41 +#define SKY1_CSIBRDGE2_RST_N 42 +#define SKY1_CSIBRDGE3_RST_N 43 +#define SKY1_GMAC0_RST_N 44 +#define SKY1_GMAC1_RST_N 45 +#define SKY1_PCIE0_RESET_N 46 +#define SKY1_PCIE1_RESET_N 47 +#define SKY1_PCIE2_RESET_N 48 +#define SKY1_PCIE3_RESET_N 49 +#define SKY1_PCIE4_RESET_N 50 + +/* reset group1 for usb phys */ +#define SKY1_USB_DP_PHY0_PRST_N 51 +#define SKY1_USB_DP_PHY1_PRST_N 52 +#define SKY1_USB_DP_PHY2_PRST_N 53 +#define SKY1_USB_DP_PHY3_PRST_N 54 +#define SKY1_USB_DP_PHY0_RST_N 55 +#define SKY1_USB_DP_PHY1_RST_N 56 +#define SKY1_USB_DP_PHY2_RST_N 57 +#define SKY1_USB_DP_PHY3_RST_N 58 +#define SKY1_USBPHY_SS_PST_N 59 +#define SKY1_USBPHY_SS_RST_N 60 +#define SKY1_USBPHY_HS0_PRST_N 61 +#define SKY1_USBPHY_HS1_PRST_N 62 +#define SKY1_USBPHY_HS2_PRST_N 63 +#define SKY1_USBPHY_HS3_PRST_N 64 +#define SKY1_USBPHY_HS4_PRST_N 65 +#define SKY1_USBPHY_HS5_PRST_N 66 +#define SKY1_USBPHY_HS6_PRST_N 67 +#define SKY1_USBPHY_HS7_PRST_N 68 +#define SKY1_USBPHY_HS8_PRST_N 69 +#define SKY1_USBPHY_HS9_PRST_N 70 + +/* reset group1 for usb controllers */ +#define SKY1_USBC_SS0_PRST_N 71 +#define SKY1_USBC_SS1_PRST_N 72 +#define SKY1_USBC_SS2_PRST_N 73 +#define SKY1_USBC_SS3_PRST_N 74 +#define SKY1_USBC_SS4_PRST_N 75 +#define SKY1_USBC_SS5_PRST_N 76 +#define SKY1_USBC_SS0_RST_N 77 +#define SKY1_USBC_SS1_RST_N 78 +#define SKY1_USBC_SS2_RST_N 79 +#define SKY1_USBC_SS3_RST_N 80 +#define SKY1_USBC_SS4_RST_N 81 +#define SKY1_USBC_SS5_RST_N 82 +#define SKY1_USBC_HS0_PRST_N 83 +#define SKY1_USBC_HS1_PRST_N 84 +#define SKY1_USBC_HS2_PRST_N 85 +#define SKY1_USBC_HS3_PRST_N 86 +#define SKY1_USBC_HS0_RST_N 87 +#define SKY1_USBC_HS1_RST_N 88 +#define SKY1_USBC_HS2_RST_N 89 +#define SKY1_USBC_HS3_RST_N 90 + +/* reset group0 for rcsu */ +#define SKY1_AUDIO_RCSU_RESET_N 91 +#define SKY1_CI700_RCSU_RESET_N 92 +#define SKY1_CSI_RCSU0_RESET_N 93 +#define SKY1_CSI_RCSU1_RESET_N 94 +#define SKY1_CSU_PM_RCSU_RESET_N 95 +#define SKY1_DDR_BROADCAST_RCSU_RESET_N 96 +#define SKY1_DDR_CTRL_RCSU_0_RESET_N 97 +#define SKY1_DDR_CTRL_RCSU_1_RESET_N 98 +#define SKY1_DDR_CTRL_RCSU_2_RESET_N 99 +#define SKY1_DDR_CTRL_RCSU_3_RESET_N 100 +#define SKY1_DDR_TZC400_RCSU_0_RESET_N 101 +#define SKY1_DDR_TZC400_RCSU_1_RESET_N 102 +#define SKY1_DDR_TZC400_RCSU_2_RESET_N 103 +#define SKY1_DDR_TZC400_RCSU_3_RESET_N 104 +#define SKY1_DP0_RCSU_RESET_N 105 +#define SKY1_DP1_RCSU_RESET_N 106 +#define SKY1_DP2_RCSU_RESET_N 107 +#define SKY1_DP3_RCSU_RESET_N 108 +#define SKY1_DP4_RCSU_RESET_N 109 +#define SKY1_DPU0_RCSU_RESET_N 110 +#define SKY1_DPU1_RCSU_RESET_N 111 +#define SKY1_DPU2_RCSU_RESET_N 112 +#define SKY1_DPU3_RCSU_RESET_N 113 +#define SKY1_DPU4_RCSU_RESET_N 114 +#define SKY1_DSU_RCSU_RESET_N 115 +#define SKY1_FCH_RCSU_RESET_N 116 +#define SKY1_GICD_RCSU_RESET_N 117 +#define SKY1_GMAC_RCSU_RESET_N 118 +#define SKY1_GPU_RCSU_RESET_N 119 +#define SKY1_ISP_RCSU0_RESET_N 120 +#define SKY1_ISP_RCSU1_RESET_N 121 +#define SKY1_NI700_MMHUB_RCSU_RESET_N 122 + +/* reset group1 for rcsu */ +#define SKY1_NPU_RCSU_RESET_N 123 +#define SKY1_NI700_PCIE_RCSU_RESET_N 124 +#define SKY1_PCIE_X421_RCSU_RESET_N 125 +#define SKY1_PCIE_X8_RCSU_RESET_N 126 +#define SKY1_SF_RCSU_RESET_N 127 +#define SKY1_RCSU_SMMU_MMHUB_RESET_N 128 +#define SKY1_RCSU_SMMU_PCIEHUB_RESET_N 129 +#define SKY1_RCSU_SYSHUB_RESET_N 130 +#define SKY1_NI700_SMN_RCSU_RESET_N 131 +#define SKY1_NI700_SYSHUB_RCSU_RESET_N 132 +#define SKY1_RCSU_USB2_HOST0_RESET_N 133 +#define SKY1_RCSU_USB2_HOST1_RESET_N 134 +#define SKY1_RCSU_USB2_HOST2_RESET_N 135 +#define SKY1_RCSU_USB2_HOST3_RESET_N 136 +#define SKY1_RCSU_USB3_TYPEA_DRD_RESET_N 137 +#define SKY1_RCSU_USB3_TYPEC_DRD_RESET_N 138 +#define SKY1_RCSU_USB3_TYPEC_HOST0_RESET_N 139 +#define SKY1_RCSU_USB3_TYPEC_HOST1_RESET_N 140 +#define SKY1_RCSU_USB3_TYPEC_HOST2_RESET_N 141 +#define SKY1_VPU_RCSU_RESET_N 142 + +#define SKY1_RESET_NUM 143 + +#endif + -- 2.49.0 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 1/3] dt-bindings: reset: add sky1 reset controller 2025-11-07 3:38 ` [PATCH 1/3] dt-bindings: reset: add sky1 reset controller Gary Yang @ 2025-11-07 7:17 ` Krzysztof Kozlowski 2025-11-10 5:56 ` 回复: " Gary Yang 2025-11-07 13:25 ` Philipp Zabel 1 sibling, 1 reply; 17+ messages in thread From: Krzysztof Kozlowski @ 2025-11-07 7:17 UTC (permalink / raw) To: Gary Yang, p.zabel, robh, krzk+dt, conor+dt Cc: devicetree, linux-kernel, linux-arm-kernel, cix-kernel-upstream On 07/11/2025 04:38, Gary Yang wrote: > +maintainers: > + - Gary Yang <gary.yang@cixtech.com> > + > +description: | > + CIX Sky1 reset controller can be used to reset various set of peripherals. > + There are two reset controllers, one is located in S0 domain, the other > + is located in S5 domain. > + > + See also: > + - dt-bindings/reset/cix,sky1-rst.h Use full path here. > + > +properties: > + compatible: > + items: > + - enum: > + - cix,sky1-rst > + - cix,sky1-rst-fch > + - const: syscon > + > + reg: > + maxItems: 2 You need to list the items. > + > + '#reset-cells': > + const: 1 > + > +required: > + - compatible > + - reg > + - '#reset-cells' > + > +additionalProperties: false > + > +examples: > + - | > + #include <dt-bindings/reset/cix,sky1-rst.h> > + reset-controller@16000000 { > + compatible = "cix,sky1-rst", "syscon"; > + reg = <0x0 0x16000000 0x0 0x1000>; Clearly wrong - you said two items. > + #reset-cells = <1>; > + }; ... > + > +#define SKY1_FCH_RESET_NUM 29 Drop, not ABI (usually). > + > +#endif > + ... > + > +#define SKY1_RESET_NUM 143 Drop Best regards, Krzysztof ^ permalink raw reply [flat|nested] 17+ messages in thread
* 回复: [PATCH 1/3] dt-bindings: reset: add sky1 reset controller 2025-11-07 7:17 ` Krzysztof Kozlowski @ 2025-11-10 5:56 ` Gary Yang 0 siblings, 0 replies; 17+ messages in thread From: Gary Yang @ 2025-11-10 5:56 UTC (permalink / raw) To: Krzysztof Kozlowski, p.zabel@pengutronix.de, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, cix-kernel-upstream Hi Krzysztof: I'm glad to see your comments again. > -----邮件原件----- > 发件人: Krzysztof Kozlowski <krzk@kernel.org> > 发送时间: 2025年11月7日 15:18 > 收件人: Gary Yang <gary.yang@cixtech.com>; p.zabel@pengutronix.de; > robh@kernel.org; krzk+dt@kernel.org; conor+dt@kernel.org > 抄送: devicetree@vger.kernel.org; linux-kernel@vger.kernel.org; > linux-arm-kernel@lists.infradead.org; cix-kernel-upstream > <cix-kernel-upstream@cixtech.com> > 主题: Re: [PATCH 1/3] dt-bindings: reset: add sky1 reset controller > > EXTERNAL EMAIL > > On 07/11/2025 04:38, Gary Yang wrote: > > +maintainers: > > + - Gary Yang <gary.yang@cixtech.com> > > + > > +description: | > > + CIX Sky1 reset controller can be used to reset various set of peripherals. > > + There are two reset controllers, one is located in S0 domain, the other > > + is located in S5 domain. > > + > > + See also: > > + - dt-bindings/reset/cix,sky1-rst.h > > Use full path here. > OK, we will use full path: include/dt-bindings/reset/cix,sky1-rst.h > > + > > +properties: > > + compatible: > > + items: > > + - enum: > > + - cix,sky1-rst > > + - cix,sky1-rst-fch > > + - const: syscon > > + > > + reg: > > + maxItems: 2 > > You need to list the items. > Sorry, to fix a build warning, make a mistake, we will fix it > > + > > + '#reset-cells': > > + const: 1 > > + > > +required: > > + - compatible > > + - reg > > + - '#reset-cells' > > + > > +additionalProperties: false > > + > > +examples: > > + - | > > + #include <dt-bindings/reset/cix,sky1-rst.h> > > + reset-controller@16000000 { > > + compatible = "cix,sky1-rst", "syscon"; > > + reg = <0x0 0x16000000 0x0 0x1000>; > > Clearly wrong - you said two items. > We will use reg = <0x16000000 0x1000> to instead of it > > + #reset-cells = <1>; > > + }; > > > ... > > > > + > > +#define SKY1_FCH_RESET_NUM 29 > > Drop, not ABI (usually). > Ok, we will delete it > > + > > +#endif > > + > > ... > > > + > > +#define SKY1_RESET_NUM 143 > > Drop > > Ok, we will delete it Best wishes Gary > > Best regards, > Krzysztof ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/3] dt-bindings: reset: add sky1 reset controller 2025-11-07 3:38 ` [PATCH 1/3] dt-bindings: reset: add sky1 reset controller Gary Yang 2025-11-07 7:17 ` Krzysztof Kozlowski @ 2025-11-07 13:25 ` Philipp Zabel 2025-11-10 6:43 ` 回复: " Gary Yang 1 sibling, 1 reply; 17+ messages in thread From: Philipp Zabel @ 2025-11-07 13:25 UTC (permalink / raw) To: Gary Yang, robh, krzk+dt, conor+dt Cc: devicetree, linux-kernel, linux-arm-kernel, cix-kernel-upstream On Fr, 2025-11-07 at 11:38 +0800, Gary Yang wrote: > There are two reset controllers on Cix sky1 Soc. > One is located in S0 domain, and the other is located > in S5 domain. > > Signed-off-by: Gary Yang <gary.yang@cixtech.com> > --- > .../bindings/reset/cix,sky1-rst.yaml | 48 +++++ > include/dt-bindings/reset/cix,sky1-rst-fch.h | 45 +++++ > include/dt-bindings/reset/cix,sky1-rst.h | 167 ++++++++++++++++++ > 3 files changed, 260 insertions(+) > create mode 100644 Documentation/devicetree/bindings/reset/cix,sky1-rst.yaml > create mode 100644 include/dt-bindings/reset/cix,sky1-rst-fch.h > create mode 100644 include/dt-bindings/reset/cix,sky1-rst.h > > diff --git a/Documentation/devicetree/bindings/reset/cix,sky1-rst.yaml b/Documentation/devicetree/bindings/reset/cix,sky1-rst.yaml > new file mode 100644 > index 000000000000..72de480b064c > --- /dev/null > +++ b/Documentation/devicetree/bindings/reset/cix,sky1-rst.yaml > @@ -0,0 +1,48 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/reset/cix,sky1-rst.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: CIX Sky1 Reset Controller > + > +maintainers: > + - Gary Yang <gary.yang@cixtech.com> > + > +description: | > + CIX Sky1 reset controller can be used to reset various set of peripherals. > + There are two reset controllers, one is located in S0 domain, the other > + is located in S5 domain. > + > + See also: > + - dt-bindings/reset/cix,sky1-rst.h > + > +properties: > + compatible: > + items: > + - enum: > + - cix,sky1-rst > + - cix,sky1-rst-fch > + - const: syscon Why is this syscon? Is there anything besides reset controls in the register space? regards Philipp ^ permalink raw reply [flat|nested] 17+ messages in thread
* 回复: [PATCH 1/3] dt-bindings: reset: add sky1 reset controller 2025-11-07 13:25 ` Philipp Zabel @ 2025-11-10 6:43 ` Gary Yang 0 siblings, 0 replies; 17+ messages in thread From: Gary Yang @ 2025-11-10 6:43 UTC (permalink / raw) To: Philipp Zabel, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, cix-kernel-upstream Hi Philipp: First thanks for your comments > -----邮件原件----- > 发件人: Philipp Zabel <p.zabel@pengutronix.de> > 发送时间: 2025年11月7日 21:25 > 收件人: Gary Yang <gary.yang@cixtech.com>; robh@kernel.org; > krzk+dt@kernel.org; conor+dt@kernel.org > 抄送: devicetree@vger.kernel.org; linux-kernel@vger.kernel.org; > linux-arm-kernel@lists.infradead.org; cix-kernel-upstream > <cix-kernel-upstream@cixtech.com> > 主题: Re: [PATCH 1/3] dt-bindings: reset: add sky1 reset controller > > [You don't often get email from p.zabel@pengutronix.de. Learn why this is > important at https://aka.ms/LearnAboutSenderIdentification ] > > EXTERNAL EMAIL > > CAUTION: Suspicious Email from unusual domain. > > On Fr, 2025-11-07 at 11:38 +0800, Gary Yang wrote: > > There are two reset controllers on Cix sky1 Soc. > > One is located in S0 domain, and the other is located in S5 domain. > > > > Signed-off-by: Gary Yang <gary.yang@cixtech.com> > > --- > > .../bindings/reset/cix,sky1-rst.yaml | 48 +++++ > > include/dt-bindings/reset/cix,sky1-rst-fch.h | 45 +++++ > > include/dt-bindings/reset/cix,sky1-rst.h | 167 > ++++++++++++++++++ > > 3 files changed, 260 insertions(+) > > create mode 100644 > > Documentation/devicetree/bindings/reset/cix,sky1-rst.yaml > > create mode 100644 include/dt-bindings/reset/cix,sky1-rst-fch.h > > create mode 100644 include/dt-bindings/reset/cix,sky1-rst.h > > > > diff --git a/Documentation/devicetree/bindings/reset/cix,sky1-rst.yaml > > b/Documentation/devicetree/bindings/reset/cix,sky1-rst.yaml > > new file mode 100644 > > index 000000000000..72de480b064c > > --- /dev/null > > +++ b/Documentation/devicetree/bindings/reset/cix,sky1-rst.yaml > > @@ -0,0 +1,48 @@ > > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) %YAML 1.2 > > +--- > > +$id: http://devicetree.org/schemas/reset/cix,sky1-rst.yaml# > > +$schema: http://devicetree.org/meta-schemas/core.yaml# > > + > > +title: CIX Sky1 Reset Controller > > + > > +maintainers: > > + - Gary Yang <gary.yang@cixtech.com> > > + > > +description: | > > + CIX Sky1 reset controller can be used to reset various set of peripherals. > > + There are two reset controllers, one is located in S0 domain, the > > +other > > + is located in S5 domain. > > + > > + See also: > > + - dt-bindings/reset/cix,sky1-rst.h > > + > > +properties: > > + compatible: > > + items: > > + - enum: > > + - cix,sky1-rst > > + - cix,sky1-rst-fch > > + - const: syscon > > Why is this syscon? Is there anything besides reset controls in the register > space? > Yes, there are some controllers in the register space, for example, a controller used to manager wake up sources. Best wishes Gary > regards > Philipp ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 2/3] Reset: cix: add support for cix sky1 resets 2025-11-07 3:38 [PATCH 0/3] Add support for Cix Sky1 resets Gary Yang 2025-11-07 3:38 ` [PATCH 1/3] dt-bindings: reset: add sky1 reset controller Gary Yang @ 2025-11-07 3:38 ` Gary Yang 2025-11-07 7:19 ` Krzysztof Kozlowski 2025-11-07 13:25 ` Philipp Zabel 2025-11-07 3:38 ` [PATCH 3/3] dts: reset: " Gary Yang 2 siblings, 2 replies; 17+ messages in thread From: Gary Yang @ 2025-11-07 3:38 UTC (permalink / raw) To: p.zabel, robh, krzk+dt, conor+dt Cc: devicetree, linux-kernel, linux-arm-kernel, cix-kernel-upstream, Gary Yang There are two reset controllers on Cix Sky1 Soc. One is located in S0 domain, and the other is located in S5 domain. Signed-off-by: Gary Yang <gary.yang@cixtech.com> --- drivers/reset/Kconfig | 7 + drivers/reset/Makefile | 1 + drivers/reset/reset-sky1.c | 403 +++++++++++++++++++++++++++++++++++++ 3 files changed, 411 insertions(+) create mode 100644 drivers/reset/reset-sky1.c diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig index 78b7078478d4..45768cd3b135 100644 --- a/drivers/reset/Kconfig +++ b/drivers/reset/Kconfig @@ -278,6 +278,13 @@ config RESET_SIMPLE - SiFive FU740 SoCs - Sophgo SoCs +config RESET_SKY1 + bool "Cix Sky1 reset controller" + depends on HAS_IOMEM + depends on ARCH_CIX || COMPILE_TEST + help + This enables the reset controller for Cix Sky1. + config RESET_SOCFPGA bool "SoCFPGA Reset Driver" if COMPILE_TEST && (!ARM || !ARCH_INTEL_SOCFPGA) default ARM && ARCH_INTEL_SOCFPGA diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile index f7934f9fb90b..a878ac4a6e4b 100644 --- a/drivers/reset/Makefile +++ b/drivers/reset/Makefile @@ -36,6 +36,7 @@ obj-$(CONFIG_RESET_RZG2L_USBPHY_CTRL) += reset-rzg2l-usbphy-ctrl.o obj-$(CONFIG_RESET_RZV2H_USB2PHY) += reset-rzv2h-usb2phy.o obj-$(CONFIG_RESET_SCMI) += reset-scmi.o obj-$(CONFIG_RESET_SIMPLE) += reset-simple.o +obj-$(CONFIG_RESET_SKY1) += reset-sky1.o obj-$(CONFIG_RESET_SOCFPGA) += reset-socfpga.o obj-$(CONFIG_RESET_SPACEMIT) += reset-spacemit.o obj-$(CONFIG_RESET_SUNPLUS) += reset-sunplus.o diff --git a/drivers/reset/reset-sky1.c b/drivers/reset/reset-sky1.c new file mode 100644 index 000000000000..14aa7292c0d5 --- /dev/null +++ b/drivers/reset/reset-sky1.c @@ -0,0 +1,403 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * + * CIX System Reset Controller (SRC) driver + * + * Author: Jerry Zhu <jerry.zhu@cixtech.com> + */ + +#include <linux/delay.h> +#include <linux/mfd/syscon.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/platform_device.h> +#include <linux/reset-controller.h> +#include <linux/regmap.h> + +#include <dt-bindings/reset/cix,sky1-rst.h> +#include <dt-bindings/reset/cix,sky1-rst-fch.h> + +#define SKY1_RESET_SLEEP_MIN_US 10000 +#define SKY1_RESET_SLEEP_MAX_US 20000 + +struct sky1_src_signal { + unsigned int offset, mask; +}; + +struct sky1_src_variant { + const struct sky1_src_signal *signals; + unsigned int signals_num; +}; + +struct sky1_src { + struct reset_controller_dev rcdev; + struct regmap *regmap; + const struct sky1_src_signal *signals; +}; + +enum { + CSU_PM_RESET = 0x304, + SENSORHUB_RESET = 0x308, + SENSORHUB_NOC_RESET = 0x30c, + + RESET_GROUP0_S0_DOMAIN_0 = 0x400, + RESET_GROUP0_S0_DOMAIN_1 = 0x404, + RESET_GROUP1_USB_PHYS = 0x408, + RESET_GROUP1_USB_CONTROLLERS = 0x40c, + + RESET_GROUP0_RCSU = 0x800, + RESET_GROUP1_RCSU = 0x804, + +}; + +static const struct sky1_src_signal sky1_src_signals[SKY1_RESET_NUM] = { + /* reset group1 for s0 domain modules */ + [SKY1_CSU_PM_RESET_N] = { CSU_PM_RESET, BIT(0) }, + [SKY1_SENSORHUB_RESET_N] = { SENSORHUB_RESET, BIT(0) }, + [SKY1_SENSORHUB_NOC_RESET_N] = { SENSORHUB_NOC_RESET, BIT(0) }, + [SKY1_DDRC_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(0) }, + [SKY1_GIC_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(1) }, + [SKY1_CI700_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(2) }, + [SKY1_SYS_NI700_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(3) }, + [SKY1_MM_NI700_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(4) }, + [SKY1_PCIE_NI700_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(5) }, + [SKY1_GPU_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(6) }, + [SKY1_NPUTOP_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(7) }, + [SKY1_NPUCORE0_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(8) }, + [SKY1_NPUCORE1_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(9) }, + [SKY1_NPUCORE2_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(10) }, + [SKY1_VPU_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(11) }, + [SKY1_ISP_SRESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(12) }, + [SKY1_ISP_ARESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(13) }, + [SKY1_ISP_HRESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(14) }, + [SKY1_ISP_GDCRESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(15) }, + [SKY1_DPU_RESET0_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(16) }, + [SKY1_DPU_RESET1_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(17) }, + [SKY1_DPU_RESET2_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(18) }, + [SKY1_DPU_RESET3_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(19) }, + [SKY1_DPU_RESET4_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(20) }, + [SKY1_DP_RESET0_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(21) }, + [SKY1_DP_RESET1_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(22) }, + [SKY1_DP_RESET2_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(23) }, + [SKY1_DP_RESET3_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(24) }, + [SKY1_DP_RESET4_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(25) }, + [SKY1_DP_PHY_RST_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(26) }, + + /* reset group1 for s0 domain modules */ + [SKY1_AUDIO_HIFI5_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(0) }, + [SKY1_AUDIO_HIFI5_NOC_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(1) }, + [SKY1_CSIDPHY_PRST0_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(2) }, + [SKY1_CSIDPHY_CMNRST0_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(3) }, + [SKY1_CSI0_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(4) }, + [SKY1_CSIDPHY_PRST1_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(5) }, + [SKY1_CSIDPHY_CMNRST1_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(6) }, + [SKY1_CSI1_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(7) }, + [SKY1_CSI2_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(8) }, + [SKY1_CSI3_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(9) }, + [SKY1_CSIBRDGE0_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(10) }, + [SKY1_CSIBRDGE1_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(11) }, + [SKY1_CSIBRDGE2_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(12) }, + [SKY1_CSIBRDGE3_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(13) }, + [SKY1_GMAC0_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(14) }, + [SKY1_GMAC1_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(15) }, + [SKY1_PCIE0_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(16) }, + [SKY1_PCIE1_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(17) }, + [SKY1_PCIE2_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(18) }, + [SKY1_PCIE3_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(19) }, + [SKY1_PCIE4_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(20) }, + + /* reset group1 for usb phys */ + [SKY1_USB_DP_PHY0_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(0) }, + [SKY1_USB_DP_PHY1_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(1) }, + [SKY1_USB_DP_PHY2_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(2) }, + [SKY1_USB_DP_PHY3_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(3) }, + [SKY1_USB_DP_PHY0_RST_N] = { RESET_GROUP1_USB_PHYS, BIT(4) }, + [SKY1_USB_DP_PHY1_RST_N] = { RESET_GROUP1_USB_PHYS, BIT(5) }, + [SKY1_USB_DP_PHY2_RST_N] = { RESET_GROUP1_USB_PHYS, BIT(6) }, + [SKY1_USB_DP_PHY3_RST_N] = { RESET_GROUP1_USB_PHYS, BIT(7) }, + [SKY1_USBPHY_SS_PST_N] = { RESET_GROUP1_USB_PHYS, BIT(8) }, + [SKY1_USBPHY_SS_RST_N] = { RESET_GROUP1_USB_PHYS, BIT(9) }, + [SKY1_USBPHY_HS0_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(10) }, + [SKY1_USBPHY_HS1_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(11) }, + [SKY1_USBPHY_HS2_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(12) }, + [SKY1_USBPHY_HS3_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(13) }, + [SKY1_USBPHY_HS4_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(14) }, + [SKY1_USBPHY_HS5_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(15) }, + [SKY1_USBPHY_HS6_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(16) }, + [SKY1_USBPHY_HS7_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(17) }, + [SKY1_USBPHY_HS8_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(18) }, + [SKY1_USBPHY_HS9_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(19) }, + + /* reset group1 for usb controllers */ + [SKY1_USBC_SS0_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(0) }, + [SKY1_USBC_SS1_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(1) }, + [SKY1_USBC_SS2_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(2) }, + [SKY1_USBC_SS3_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(3) }, + [SKY1_USBC_SS4_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(4) }, + [SKY1_USBC_SS5_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(5) }, + [SKY1_USBC_SS0_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(6) }, + [SKY1_USBC_SS1_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(7) }, + [SKY1_USBC_SS2_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(8) }, + [SKY1_USBC_SS3_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(9) }, + [SKY1_USBC_SS4_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(10) }, + [SKY1_USBC_SS5_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(11) }, + [SKY1_USBC_HS0_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(12) }, + [SKY1_USBC_HS1_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(13) }, + [SKY1_USBC_HS2_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(14) }, + [SKY1_USBC_HS3_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(15) }, + [SKY1_USBC_HS0_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(16) }, + [SKY1_USBC_HS1_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(17) }, + [SKY1_USBC_HS2_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(18) }, + [SKY1_USBC_HS3_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(19) }, + + /* reset group0 for rcsu */ + [SKY1_AUDIO_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(0) }, + [SKY1_CI700_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(1) }, + [SKY1_CSI_RCSU0_RESET_N] = { RESET_GROUP0_RCSU, BIT(2) }, + [SKY1_CSI_RCSU1_RESET_N] = { RESET_GROUP0_RCSU, BIT(3) }, + [SKY1_CSU_PM_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(4) }, + [SKY1_DDR_BROADCAST_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(5) }, + [SKY1_DDR_CTRL_RCSU_0_RESET_N] = { RESET_GROUP0_RCSU, BIT(6) }, + [SKY1_DDR_CTRL_RCSU_1_RESET_N] = { RESET_GROUP0_RCSU, BIT(7) }, + [SKY1_DDR_CTRL_RCSU_2_RESET_N] = { RESET_GROUP0_RCSU, BIT(8) }, + [SKY1_DDR_CTRL_RCSU_3_RESET_N] = { RESET_GROUP0_RCSU, BIT(9) }, + [SKY1_DDR_TZC400_RCSU_0_RESET_N] = { RESET_GROUP0_RCSU, BIT(10) }, + [SKY1_DDR_TZC400_RCSU_1_RESET_N] = { RESET_GROUP0_RCSU, BIT(11) }, + [SKY1_DDR_TZC400_RCSU_2_RESET_N] = { RESET_GROUP0_RCSU, BIT(12) }, + [SKY1_DDR_TZC400_RCSU_3_RESET_N] = { RESET_GROUP0_RCSU, BIT(13) }, + [SKY1_DP0_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(14) }, + [SKY1_DP1_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(15) }, + [SKY1_DP2_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(16) }, + [SKY1_DP3_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(17) }, + [SKY1_DP4_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(18) }, + [SKY1_DPU0_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(19) }, + [SKY1_DPU1_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(20) }, + [SKY1_DPU2_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(21) }, + [SKY1_DPU3_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(22) }, + [SKY1_DPU4_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(23) }, + [SKY1_DSU_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(24) }, + [SKY1_FCH_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(25) }, + [SKY1_GICD_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(26) }, + [SKY1_GMAC_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(27) }, + [SKY1_GPU_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(28) }, + [SKY1_ISP_RCSU0_RESET_N] = { RESET_GROUP0_RCSU, BIT(29) }, + [SKY1_ISP_RCSU1_RESET_N] = { RESET_GROUP0_RCSU, BIT(30) }, + [SKY1_NI700_MMHUB_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(31) }, + + /* reset group1 for rcsu */ + [SKY1_NPU_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(0) }, + [SKY1_NI700_PCIE_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(1) }, + [SKY1_PCIE_X421_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(2) }, + [SKY1_PCIE_X8_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(3) }, + [SKY1_SF_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(4) }, + [SKY1_RCSU_SMMU_MMHUB_RESET_N] = { RESET_GROUP1_RCSU, BIT(5) }, + [SKY1_RCSU_SMMU_PCIEHUB_RESET_N] = { RESET_GROUP1_RCSU, BIT(6) }, + [SKY1_RCSU_SYSHUB_RESET_N] = { RESET_GROUP1_RCSU, BIT(7) }, + [SKY1_NI700_SMN_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(8) }, + [SKY1_NI700_SYSHUB_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(9) }, + [SKY1_RCSU_USB2_HOST0_RESET_N] = { RESET_GROUP1_RCSU, BIT(10) }, + [SKY1_RCSU_USB2_HOST1_RESET_N] = { RESET_GROUP1_RCSU, BIT(11) }, + [SKY1_RCSU_USB2_HOST2_RESET_N] = { RESET_GROUP1_RCSU, BIT(12) }, + [SKY1_RCSU_USB2_HOST3_RESET_N] = { RESET_GROUP1_RCSU, BIT(13) }, + [SKY1_RCSU_USB3_TYPEA_DRD_RESET_N] = { RESET_GROUP1_RCSU, BIT(14) }, + [SKY1_RCSU_USB3_TYPEC_DRD_RESET_N] = { RESET_GROUP1_RCSU, BIT(15) }, + [SKY1_RCSU_USB3_TYPEC_HOST0_RESET_N] = { RESET_GROUP1_RCSU, BIT(16) }, + [SKY1_RCSU_USB3_TYPEC_HOST1_RESET_N] = { RESET_GROUP1_RCSU, BIT(17) }, + [SKY1_RCSU_USB3_TYPEC_HOST2_RESET_N] = { RESET_GROUP1_RCSU, BIT(18) }, + [SKY1_VPU_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(19) }, + +}; + +enum { + FCH_SW_RST_FUNC = 0x008, + FCH_SW_RST_BUS = 0x00c, + FCH_SW_XSPI = 0x010, +}; + +static const struct sky1_src_signal sky1_src_fch_signals[SKY1_FCH_RESET_NUM] = { + /* resets for fch_sw_rst_func */ + [SW_I3C0_RST_FUNC_G_N] = { FCH_SW_RST_FUNC, BIT(0) }, + [SW_I3C0_RST_FUNC_I_N] = { FCH_SW_RST_FUNC, BIT(1) }, + [SW_I3C1_RST_FUNC_G_N] = { FCH_SW_RST_FUNC, BIT(2) }, + [SW_I3C1_RST_FUNC_I_N] = { FCH_SW_RST_FUNC, BIT(3) }, + [SW_UART0_RST_FUNC_N] = { FCH_SW_RST_FUNC, BIT(4) }, + [SW_UART1_RST_FUNC_N] = { FCH_SW_RST_FUNC, BIT(5) }, + [SW_UART2_RST_FUNC_N] = { FCH_SW_RST_FUNC, BIT(6) }, + [SW_UART3_RST_FUNC_N] = { FCH_SW_RST_FUNC, BIT(7) }, + [SW_TIMER_RST_FUNC_N] = { FCH_SW_RST_FUNC, BIT(20) }, + + /* resets for fch_sw_rst_bus */ + [SW_I3C0_RST_APB_N] = { FCH_SW_RST_BUS, BIT(0) }, + [SW_I3C1_RST_APB_N] = { FCH_SW_RST_BUS, BIT(1) }, + [SW_DMA_RST_AXI_N] = { FCH_SW_RST_BUS, BIT(2) }, + [SW_UART0_RST_APB_N] = { FCH_SW_RST_BUS, BIT(4) }, + [SW_UART1_RST_APB_N] = { FCH_SW_RST_BUS, BIT(5) }, + [SW_UART2_RST_APB_N] = { FCH_SW_RST_BUS, BIT(6) }, + [SW_UART3_RST_APB_N] = { FCH_SW_RST_BUS, BIT(7) }, + [SW_SPI0_RST_APB_N] = { FCH_SW_RST_BUS, BIT(8) }, + [SW_SPI1_RST_APB_N] = { FCH_SW_RST_BUS, BIT(9) }, + [SW_I2C0_RST_APB_N] = { FCH_SW_RST_BUS, BIT(12) }, + [SW_I2C1_RST_APB_N] = { FCH_SW_RST_BUS, BIT(13) }, + [SW_I2C2_RST_APB_N] = { FCH_SW_RST_BUS, BIT(14) }, + [SW_I2C3_RST_APB_N] = { FCH_SW_RST_BUS, BIT(15) }, + [SW_I2C4_RST_APB_N] = { FCH_SW_RST_BUS, BIT(16) }, + [SW_I2C5_RST_APB_N] = { FCH_SW_RST_BUS, BIT(17) }, + [SW_I2C6_RST_APB_N] = { FCH_SW_RST_BUS, BIT(18) }, + [SW_I2C7_RST_APB_N] = { FCH_SW_RST_BUS, BIT(19) }, + [SW_GPIO_RST_APB_N] = { FCH_SW_RST_BUS, BIT(21) }, + + /* resets for fch_sw_xspi */ + [SW_XSPI_REG_RST_N] = { FCH_SW_XSPI, BIT(0) }, + [SW_XSPI_SYS_RST_N] = { FCH_SW_XSPI, BIT(1) }, +}; + +static struct sky1_src *to_sky1_src(struct reset_controller_dev *rcdev) +{ + return container_of(rcdev, struct sky1_src, rcdev); +} + +static int sky1_reset_update(struct sky1_src *sky1src, + unsigned long id, unsigned int value) +{ + const struct sky1_src_signal *signal = &sky1src->signals[id]; + + return regmap_update_bits(sky1src->regmap, + signal->offset, signal->mask, value); +} + +static int sky1_reset_set(struct reset_controller_dev *rcdev, + unsigned long id, bool assert) +{ + struct sky1_src *sky1src = to_sky1_src(rcdev); + unsigned int value = assert ? 0 : sky1src->signals[id].mask; + + return sky1_reset_update(sky1src, id, value); +} + +static int sky1_reset(struct reset_controller_dev *rcdev, + unsigned long id) +{ + sky1_reset_set(rcdev, id, true); + usleep_range(SKY1_RESET_SLEEP_MIN_US, + SKY1_RESET_SLEEP_MAX_US); + + sky1_reset_set(rcdev, id, false); + + /* + * Ensure component is taken out reset state by sleeping also after + * deasserting the reset, Otherwise, the component may not be ready + * for operation. + */ + usleep_range(SKY1_RESET_SLEEP_MIN_US, + SKY1_RESET_SLEEP_MAX_US); + return 0; +} + +static int sky1_reset_assert(struct reset_controller_dev *rcdev, + unsigned long id) +{ + return sky1_reset_set(rcdev, id, true); +} + +static int sky1_reset_deassert(struct reset_controller_dev *rcdev, + unsigned long id) +{ + return sky1_reset_set(rcdev, id, false); +} + +static int sky1_reset_status(struct reset_controller_dev *rcdev, + unsigned long id) +{ + unsigned int value = 0; + struct sky1_src *sky1_src = to_sky1_src(rcdev); + const struct sky1_src_signal *signal = &sky1_src->signals[id]; + + regmap_read(sky1_src->regmap, signal->offset, &value); + return !(value & signal->mask); +} + +static const struct reset_control_ops sky1_src_ops = { + .reset = sky1_reset, + .assert = sky1_reset_assert, + .deassert = sky1_reset_deassert, + .status = sky1_reset_status +}; + +static const struct sky1_src_variant variant_sky1 = { + .signals = sky1_src_signals, + .signals_num = ARRAY_SIZE(sky1_src_signals), +}; + +static const struct sky1_src_variant variant_sky1_fch = { + .signals = sky1_src_fch_signals, + .signals_num = ARRAY_SIZE(sky1_src_fch_signals), +}; + +static const struct regmap_config sky1_src_config = { + .reg_bits = 32, + .val_bits = 32, + .reg_stride = 4, + .name = "src", +}; + +static int sky1_reset_probe(struct platform_device *pdev) +{ + struct sky1_src *sky1src; + struct device *dev = &pdev->dev; + void __iomem *base; + const struct sky1_src_variant *variant = device_get_match_data(dev); + + sky1src = devm_kzalloc(dev, sizeof(*sky1src), GFP_KERNEL); + if (!sky1src) + return -ENOMEM; + + base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(base)) + return PTR_ERR(base); + + sky1src->regmap = devm_regmap_init_mmio(dev, base, &sky1_src_config); + if (IS_ERR(sky1src->regmap)) { + dev_err(dev, "Unable to get sky1-src regmap"); + return PTR_ERR(sky1src->regmap); + } + + sky1src->signals = variant->signals; + sky1src->rcdev.owner = THIS_MODULE; + sky1src->rcdev.nr_resets = variant->signals_num; + sky1src->rcdev.ops = &sky1_src_ops; + sky1src->rcdev.of_node = dev->of_node; + sky1src->rcdev.dev = dev; + + return devm_reset_controller_register(dev, &sky1src->rcdev); +} + +static const struct of_device_id sky1_reset_dt_ids[] = { + { .compatible = "cix,sky1-rst", .data = &variant_sky1 }, + { .compatible = "cix,sky1-rst-fch", .data = &variant_sky1_fch }, + { /* sentinel */ }, +}; +MODULE_DEVICE_TABLE(of, sky1_reset_dt_ids); + +static struct platform_driver sky1_reset_driver = { + .probe = sky1_reset_probe, + .driver = { + .name = KBUILD_MODNAME, + .of_match_table = sky1_reset_dt_ids, + }, +}; +static int __init reset_sky1_init(void) +{ + return platform_driver_register(&sky1_reset_driver); +} +subsys_initcall(reset_sky1_init); + +static void __exit reset_sky1_exit(void) +{ + platform_driver_unregister(&sky1_reset_driver); +} +module_exit(reset_sky1_exit); + +MODULE_AUTHOR("Jerry Zhu <jerry.zhu@cixtech.com>"); +MODULE_DESCRIPTION("Cix Sky1 reset driver"); +MODULE_LICENSE("GPL"); -- 2.49.0 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 2/3] Reset: cix: add support for cix sky1 resets 2025-11-07 3:38 ` [PATCH 2/3] Reset: cix: add support for cix sky1 resets Gary Yang @ 2025-11-07 7:19 ` Krzysztof Kozlowski 2025-11-10 11:18 ` 回复: " Gary Yang 2025-11-07 13:25 ` Philipp Zabel 1 sibling, 1 reply; 17+ messages in thread From: Krzysztof Kozlowski @ 2025-11-07 7:19 UTC (permalink / raw) To: Gary Yang, p.zabel, robh, krzk+dt, conor+dt Cc: devicetree, linux-kernel, linux-arm-kernel, cix-kernel-upstream On 07/11/2025 04:38, Gary Yang wrote: > There are two reset controllers on Cix Sky1 Soc. > One is located in S0 domain, and the other is located > in S5 domain. > > Signed-off-by: Gary Yang <gary.yang@cixtech.com> Please use subject prefixes matching the subsystem. You can get them for example with `git log --oneline -- DIRECTORY_OR_FILE` on the directory your patch is touching. For bindings, the preferred subjects are explained here: https://www.kernel.org/doc/html/latest/devicetree/bindings/submitting-patches.html#i-for-patch-submitters It is not "Reset:". Mark capitals. > --- ... > +static struct platform_driver sky1_reset_driver = { > + .probe = sky1_reset_probe, > + .driver = { > + .name = KBUILD_MODNAME, > + .of_match_table = sky1_reset_dt_ids, > + }, > +}; > +static int __init reset_sky1_init(void) > +{ > + return platform_driver_register(&sky1_reset_driver); > +} > +subsys_initcall(reset_sky1_init); This should be rather just module_platform_driver. Does not look like part of subsystem, but looks like regular driver. > + > +static void __exit reset_sky1_exit(void) > +{ > + platform_driver_unregister(&sky1_reset_driver); > +} > +module_exit(reset_sky1_exit); > + > +MODULE_AUTHOR("Jerry Zhu <jerry.zhu@cixtech.com>"); > +MODULE_DESCRIPTION("Cix Sky1 reset driver"); > +MODULE_LICENSE("GPL"); Best regards, Krzysztof ^ permalink raw reply [flat|nested] 17+ messages in thread
* 回复: [PATCH 2/3] Reset: cix: add support for cix sky1 resets 2025-11-07 7:19 ` Krzysztof Kozlowski @ 2025-11-10 11:18 ` Gary Yang 2025-11-10 11:22 ` Krzysztof Kozlowski 0 siblings, 1 reply; 17+ messages in thread From: Gary Yang @ 2025-11-10 11:18 UTC (permalink / raw) To: Krzysztof Kozlowski, p.zabel@pengutronix.de, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, cix-kernel-upstream Hi Krzysztof: > -----邮件原件----- > 发件人: Krzysztof Kozlowski <krzk@kernel.org> > 发送时间: 2025年11月7日 15:19 > 收件人: Gary Yang <gary.yang@cixtech.com>; p.zabel@pengutronix.de; > robh@kernel.org; krzk+dt@kernel.org; conor+dt@kernel.org > 抄送: devicetree@vger.kernel.org; linux-kernel@vger.kernel.org; > linux-arm-kernel@lists.infradead.org; cix-kernel-upstream > <cix-kernel-upstream@cixtech.com> > 主题: Re: [PATCH 2/3] Reset: cix: add support for cix sky1 resets > > EXTERNAL EMAIL > > On 07/11/2025 04:38, Gary Yang wrote: > > There are two reset controllers on Cix Sky1 Soc. > > One is located in S0 domain, and the other is located in S5 domain. > > > > Signed-off-by: Gary Yang <gary.yang@cixtech.com> > > Please use subject prefixes matching the subsystem. You can get them for > example with `git log --oneline -- DIRECTORY_OR_FILE` on the directory your > patch is touching. For bindings, the preferred subjects are explained here: > https://www.kernel.org/doc/html/latest/devicetree/bindings/submitting-patch > es.html#i-for-patch-submitters > > It is not "Reset:". Mark capitals. > OK, We will use "reset:" instead of it > > --- > > > ... > > > +static struct platform_driver sky1_reset_driver = { > > + .probe = sky1_reset_probe, > > + .driver = { > > + .name = KBUILD_MODNAME, > > + .of_match_table = sky1_reset_dt_ids, > > + }, > > +}; > > +static int __init reset_sky1_init(void) { > > + return platform_driver_register(&sky1_reset_driver); > > +} > > +subsys_initcall(reset_sky1_init); > > This should be rather just module_platform_driver. Does not look like part of > subsystem, but looks like regular driver. > Some modules depend reset module. When boot system, these modules can't probe before register reset. To make these modules probe earlier, we use subsys_initcall() to instead of module_platform_driver(). Do you have better suggestions? Best wishes Gary > > + > > +static void __exit reset_sky1_exit(void) { > > + platform_driver_unregister(&sky1_reset_driver); > > +} > > +module_exit(reset_sky1_exit); > > > > > + > > +MODULE_AUTHOR("Jerry Zhu <jerry.zhu@cixtech.com>"); > > +MODULE_DESCRIPTION("Cix Sky1 reset driver"); MODULE_LICENSE("GPL"); > > > > Best regards, > Krzysztof ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: 回复: [PATCH 2/3] Reset: cix: add support for cix sky1 resets 2025-11-10 11:18 ` 回复: " Gary Yang @ 2025-11-10 11:22 ` Krzysztof Kozlowski 2025-11-10 11:32 ` 回复: " Gary Yang 0 siblings, 1 reply; 17+ messages in thread From: Krzysztof Kozlowski @ 2025-11-10 11:22 UTC (permalink / raw) To: Gary Yang, p.zabel@pengutronix.de, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, cix-kernel-upstream On 10/11/2025 12:18, Gary Yang wrote: >> >>> +static struct platform_driver sky1_reset_driver = { >>> + .probe = sky1_reset_probe, >>> + .driver = { >>> + .name = KBUILD_MODNAME, >>> + .of_match_table = sky1_reset_dt_ids, >>> + }, >>> +}; >>> +static int __init reset_sky1_init(void) { >>> + return platform_driver_register(&sky1_reset_driver); >>> +} >>> +subsys_initcall(reset_sky1_init); >> >> This should be rather just module_platform_driver. Does not look like part of >> subsystem, but looks like regular driver. >> > > Some modules depend reset module. When boot system, these modules can't probe before register reset. Which modules? You statement is so imprecise that my only answer is: sorry, deferred probe is old thing now and everyone should use it. > To make these modules probe earlier, we use subsys_initcall() to instead of module_platform_driver(). Do you > have better suggestions? Look how deferred probe works. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 17+ messages in thread
* 回复: 回复: [PATCH 2/3] Reset: cix: add support for cix sky1 resets 2025-11-10 11:22 ` Krzysztof Kozlowski @ 2025-11-10 11:32 ` Gary Yang 2025-11-10 11:38 ` Krzysztof Kozlowski 0 siblings, 1 reply; 17+ messages in thread From: Gary Yang @ 2025-11-10 11:32 UTC (permalink / raw) To: Krzysztof Kozlowski, p.zabel@pengutronix.de, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, cix-kernel-upstream Hi krzysztof: > -----邮件原件----- > 发件人: Krzysztof Kozlowski <krzk@kernel.org> > 发送时间: 2025年11月10日 19:22 > 收件人: Gary Yang <gary.yang@cixtech.com>; p.zabel@pengutronix.de; > robh@kernel.org; krzk+dt@kernel.org; conor+dt@kernel.org > 抄送: devicetree@vger.kernel.org; linux-kernel@vger.kernel.org; > linux-arm-kernel@lists.infradead.org; cix-kernel-upstream > <cix-kernel-upstream@cixtech.com> > 主题: Re: 回复: [PATCH 2/3] Reset: cix: add support for cix sky1 resets > > EXTERNAL EMAIL > > On 10/11/2025 12:18, Gary Yang wrote: > >> > >>> +static struct platform_driver sky1_reset_driver = { > >>> + .probe = sky1_reset_probe, > >>> + .driver = { > >>> + .name = KBUILD_MODNAME, > >>> + .of_match_table = sky1_reset_dt_ids, > >>> + }, > >>> +}; > >>> +static int __init reset_sky1_init(void) { > >>> + return platform_driver_register(&sky1_reset_driver); > >>> +} > >>> +subsys_initcall(reset_sky1_init); > >> > >> This should be rather just module_platform_driver. Does not look like > >> part of subsystem, but looks like regular driver. > >> > > > > Some modules depend reset module. When boot system, these modules > can't probe before register reset. > > Which modules? You statement is so imprecise that my only answer is: > sorry, deferred probe is old thing now and everyone should use it. > > > To make these modules probe earlier, we use subsys_initcall() to > > instead of module_platform_driver(). Do you have better suggestions? > > Look how deferred probe works. > Yes, you're right. But deferred probe needs to take more time on booting. To make the boot faster, better experiences, we have to use subsys_initcall() Best wishes Gary > Best regards, > Krzysztof ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: 回复: 回复: [PATCH 2/3] Reset: cix: add support for cix sky1 resets 2025-11-10 11:32 ` 回复: " Gary Yang @ 2025-11-10 11:38 ` Krzysztof Kozlowski 2025-11-10 12:11 ` 回复: " Gary Yang 0 siblings, 1 reply; 17+ messages in thread From: Krzysztof Kozlowski @ 2025-11-10 11:38 UTC (permalink / raw) To: Gary Yang, p.zabel@pengutronix.de, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, cix-kernel-upstream On 10/11/2025 12:32, Gary Yang wrote: > Hi krzysztof: > >> -----邮件原件----- >> 发件人: Krzysztof Kozlowski <krzk@kernel.org> >> 发送时间: 2025年11月10日 19:22 >> 收件人: Gary Yang <gary.yang@cixtech.com>; p.zabel@pengutronix.de; >> robh@kernel.org; krzk+dt@kernel.org; conor+dt@kernel.org >> 抄送: devicetree@vger.kernel.org; linux-kernel@vger.kernel.org; >> linux-arm-kernel@lists.infradead.org; cix-kernel-upstream >> <cix-kernel-upstream@cixtech.com> >> 主题: Re: 回复: [PATCH 2/3] Reset: cix: add support for cix sky1 resets >> >> EXTERNAL EMAIL >> >> On 10/11/2025 12:18, Gary Yang wrote: >>>> >>>>> +static struct platform_driver sky1_reset_driver = { >>>>> + .probe = sky1_reset_probe, >>>>> + .driver = { >>>>> + .name = KBUILD_MODNAME, >>>>> + .of_match_table = sky1_reset_dt_ids, >>>>> + }, >>>>> +}; >>>>> +static int __init reset_sky1_init(void) { >>>>> + return platform_driver_register(&sky1_reset_driver); >>>>> +} >>>>> +subsys_initcall(reset_sky1_init); >>>> >>>> This should be rather just module_platform_driver. Does not look like >>>> part of subsystem, but looks like regular driver. >>>> >>> >>> Some modules depend reset module. When boot system, these modules >> can't probe before register reset. >> >> Which modules? You statement is so imprecise that my only answer is: >> sorry, deferred probe is old thing now and everyone should use it. >> >>> To make these modules probe earlier, we use subsys_initcall() to >>> instead of module_platform_driver(). Do you have better suggestions? >> >> Look how deferred probe works. >> > > Yes, you're right. But deferred probe needs to take more time on booting. > To make the boot faster, better experiences, we have to use subsys_initcall() Again, imprecise statement. How faster? With such arguments - twice (first list of unspecified modules and now of unspecified boot faster) the answer is the same. And I will not wait for third imprecise argument, because this is not a ping pong game. Anyway, manual core ordering is not the solution. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 17+ messages in thread
* 回复: 回复: 回复: [PATCH 2/3] Reset: cix: add support for cix sky1 resets 2025-11-10 11:38 ` Krzysztof Kozlowski @ 2025-11-10 12:11 ` Gary Yang 0 siblings, 0 replies; 17+ messages in thread From: Gary Yang @ 2025-11-10 12:11 UTC (permalink / raw) To: Krzysztof Kozlowski, p.zabel@pengutronix.de, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, cix-kernel-upstream Hi Krzysztof: > >> EXTERNAL EMAIL > >> > >> On 10/11/2025 12:18, Gary Yang wrote: > >>>> > >>>>> +static struct platform_driver sky1_reset_driver = { > >>>>> + .probe = sky1_reset_probe, > >>>>> + .driver = { > >>>>> + .name = KBUILD_MODNAME, > >>>>> + .of_match_table = sky1_reset_dt_ids, > >>>>> + }, > >>>>> +}; > >>>>> +static int __init reset_sky1_init(void) { > >>>>> + return platform_driver_register(&sky1_reset_driver); > >>>>> +} > >>>>> +subsys_initcall(reset_sky1_init); > >>>> > >>>> This should be rather just module_platform_driver. Does not look > >>>> like part of subsystem, but looks like regular driver. > >>>> > >>> > >>> Some modules depend reset module. When boot system, these modules > >> can't probe before register reset. > >> > >> Which modules? You statement is so imprecise that my only answer is: > >> sorry, deferred probe is old thing now and everyone should use it. > >> > >>> To make these modules probe earlier, we use subsys_initcall() to > >>> instead of module_platform_driver(). Do you have better suggestions? > >> > >> Look how deferred probe works. > >> > > > > Yes, you're right. But deferred probe needs to take more time on booting. > > To make the boot faster, better experiences, we have to use > > subsys_initcall() > > Again, imprecise statement. How faster? With such arguments - twice (first list > of unspecified modules and now of unspecified boot faster) the answer is the > same. And I will not wait for third imprecise argument, because this is not a > ping pong game. > > Anyway, manual core ordering is not the solution. > Sorry, we need not take performance into consider just now. We will use module_platform_driver() to instead of it. Best wishes Gary > Best regards, > Krzysztof ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 2/3] Reset: cix: add support for cix sky1 resets 2025-11-07 3:38 ` [PATCH 2/3] Reset: cix: add support for cix sky1 resets Gary Yang 2025-11-07 7:19 ` Krzysztof Kozlowski @ 2025-11-07 13:25 ` Philipp Zabel 1 sibling, 0 replies; 17+ messages in thread From: Philipp Zabel @ 2025-11-07 13:25 UTC (permalink / raw) To: Gary Yang, robh, krzk+dt, conor+dt Cc: devicetree, linux-kernel, linux-arm-kernel, cix-kernel-upstream On Fr, 2025-11-07 at 11:38 +0800, Gary Yang wrote: > There are two reset controllers on Cix Sky1 Soc. > One is located in S0 domain, and the other is located > in S5 domain. > > Signed-off-by: Gary Yang <gary.yang@cixtech.com> > --- > drivers/reset/Kconfig | 7 + > drivers/reset/Makefile | 1 + > drivers/reset/reset-sky1.c | 403 +++++++++++++++++++++++++++++++++++++ > 3 files changed, 411 insertions(+) > create mode 100644 drivers/reset/reset-sky1.c > [...] > diff --git a/drivers/reset/reset-sky1.c b/drivers/reset/reset-sky1.c > new file mode 100644 > index 000000000000..14aa7292c0d5 > --- /dev/null > +++ b/drivers/reset/reset-sky1.c > @@ -0,0 +1,403 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * > + * CIX System Reset Controller (SRC) driver > + * > + * Author: Jerry Zhu <jerry.zhu@cixtech.com> > + */ > + > +#include <linux/delay.h> > +#include <linux/mfd/syscon.h> This appears to be unused. Is this a left-over or did you intend to register the regmap with syscon? > +#include <linux/module.h> > +#include <linux/of.h> > +#include <linux/of_device.h> > +#include <linux/platform_device.h> > +#include <linux/reset-controller.h> > +#include <linux/regmap.h> > + > +#include <dt-bindings/reset/cix,sky1-rst.h> > +#include <dt-bindings/reset/cix,sky1-rst-fch.h> > + > +#define SKY1_RESET_SLEEP_MIN_US 10000 > +#define SKY1_RESET_SLEEP_MAX_US 20000 > + > +struct sky1_src_signal { > + unsigned int offset, mask; Since all masks only contain a single BIT(), consider storing the bit index instead. > +}; > + > +struct sky1_src_variant { > + const struct sky1_src_signal *signals; > + unsigned int signals_num; > +}; > + > +struct sky1_src { > + struct reset_controller_dev rcdev; > + struct regmap *regmap; > + const struct sky1_src_signal *signals; > +}; > + > +enum { > + CSU_PM_RESET = 0x304, > + SENSORHUB_RESET = 0x308, > + SENSORHUB_NOC_RESET = 0x30c, > + > + RESET_GROUP0_S0_DOMAIN_0 = 0x400, > + RESET_GROUP0_S0_DOMAIN_1 = 0x404, > + RESET_GROUP1_USB_PHYS = 0x408, > + RESET_GROUP1_USB_CONTROLLERS = 0x40c, > + > + RESET_GROUP0_RCSU = 0x800, > + RESET_GROUP1_RCSU = 0x804, > + > +}; > + > +static const struct sky1_src_signal sky1_src_signals[SKY1_RESET_NUM] = { Just drop SKY1_RESET_NUM. > + /* reset group1 for s0 domain modules */ > + [SKY1_CSU_PM_RESET_N] = { CSU_PM_RESET, BIT(0) }, > + [SKY1_SENSORHUB_RESET_N] = { SENSORHUB_RESET, BIT(0) }, > + [SKY1_SENSORHUB_NOC_RESET_N] = { SENSORHUB_NOC_RESET, BIT(0) }, > + [SKY1_DDRC_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(0) }, > + [SKY1_GIC_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(1) }, > + [SKY1_CI700_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(2) }, > + [SKY1_SYS_NI700_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(3) }, > + [SKY1_MM_NI700_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(4) }, > + [SKY1_PCIE_NI700_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(5) }, > + [SKY1_GPU_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(6) }, > + [SKY1_NPUTOP_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(7) }, > + [SKY1_NPUCORE0_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(8) }, > + [SKY1_NPUCORE1_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(9) }, > + [SKY1_NPUCORE2_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(10) }, > + [SKY1_VPU_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(11) }, > + [SKY1_ISP_SRESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(12) }, > + [SKY1_ISP_ARESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(13) }, > + [SKY1_ISP_HRESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(14) }, > + [SKY1_ISP_GDCRESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(15) }, > + [SKY1_DPU_RESET0_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(16) }, > + [SKY1_DPU_RESET1_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(17) }, > + [SKY1_DPU_RESET2_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(18) }, > + [SKY1_DPU_RESET3_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(19) }, > + [SKY1_DPU_RESET4_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(20) }, > + [SKY1_DP_RESET0_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(21) }, > + [SKY1_DP_RESET1_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(22) }, > + [SKY1_DP_RESET2_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(23) }, > + [SKY1_DP_RESET3_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(24) }, > + [SKY1_DP_RESET4_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(25) }, > + [SKY1_DP_PHY_RST_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(26) }, > + > + /* reset group1 for s0 domain modules */ > + [SKY1_AUDIO_HIFI5_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(0) }, > + [SKY1_AUDIO_HIFI5_NOC_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(1) }, > + [SKY1_CSIDPHY_PRST0_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(2) }, > + [SKY1_CSIDPHY_CMNRST0_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(3) }, > + [SKY1_CSI0_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(4) }, > + [SKY1_CSIDPHY_PRST1_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(5) }, > + [SKY1_CSIDPHY_CMNRST1_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(6) }, > + [SKY1_CSI1_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(7) }, > + [SKY1_CSI2_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(8) }, > + [SKY1_CSI3_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(9) }, > + [SKY1_CSIBRDGE0_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(10) }, > + [SKY1_CSIBRDGE1_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(11) }, > + [SKY1_CSIBRDGE2_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(12) }, > + [SKY1_CSIBRDGE3_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(13) }, > + [SKY1_GMAC0_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(14) }, > + [SKY1_GMAC1_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(15) }, > + [SKY1_PCIE0_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(16) }, > + [SKY1_PCIE1_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(17) }, > + [SKY1_PCIE2_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(18) }, > + [SKY1_PCIE3_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(19) }, > + [SKY1_PCIE4_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(20) }, > + > + /* reset group1 for usb phys */ > + [SKY1_USB_DP_PHY0_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(0) }, > + [SKY1_USB_DP_PHY1_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(1) }, > + [SKY1_USB_DP_PHY2_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(2) }, > + [SKY1_USB_DP_PHY3_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(3) }, > + [SKY1_USB_DP_PHY0_RST_N] = { RESET_GROUP1_USB_PHYS, BIT(4) }, > + [SKY1_USB_DP_PHY1_RST_N] = { RESET_GROUP1_USB_PHYS, BIT(5) }, > + [SKY1_USB_DP_PHY2_RST_N] = { RESET_GROUP1_USB_PHYS, BIT(6) }, > + [SKY1_USB_DP_PHY3_RST_N] = { RESET_GROUP1_USB_PHYS, BIT(7) }, > + [SKY1_USBPHY_SS_PST_N] = { RESET_GROUP1_USB_PHYS, BIT(8) }, > + [SKY1_USBPHY_SS_RST_N] = { RESET_GROUP1_USB_PHYS, BIT(9) }, > + [SKY1_USBPHY_HS0_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(10) }, > + [SKY1_USBPHY_HS1_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(11) }, > + [SKY1_USBPHY_HS2_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(12) }, > + [SKY1_USBPHY_HS3_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(13) }, > + [SKY1_USBPHY_HS4_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(14) }, > + [SKY1_USBPHY_HS5_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(15) }, > + [SKY1_USBPHY_HS6_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(16) }, > + [SKY1_USBPHY_HS7_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(17) }, > + [SKY1_USBPHY_HS8_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(18) }, > + [SKY1_USBPHY_HS9_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(19) }, > + > + /* reset group1 for usb controllers */ > + [SKY1_USBC_SS0_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(0) }, > + [SKY1_USBC_SS1_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(1) }, > + [SKY1_USBC_SS2_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(2) }, > + [SKY1_USBC_SS3_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(3) }, > + [SKY1_USBC_SS4_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(4) }, > + [SKY1_USBC_SS5_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(5) }, > + [SKY1_USBC_SS0_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(6) }, > + [SKY1_USBC_SS1_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(7) }, > + [SKY1_USBC_SS2_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(8) }, > + [SKY1_USBC_SS3_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(9) }, > + [SKY1_USBC_SS4_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(10) }, > + [SKY1_USBC_SS5_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(11) }, > + [SKY1_USBC_HS0_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(12) }, > + [SKY1_USBC_HS1_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(13) }, > + [SKY1_USBC_HS2_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(14) }, > + [SKY1_USBC_HS3_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(15) }, > + [SKY1_USBC_HS0_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(16) }, > + [SKY1_USBC_HS1_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(17) }, > + [SKY1_USBC_HS2_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(18) }, > + [SKY1_USBC_HS3_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(19) }, > + > + /* reset group0 for rcsu */ > + [SKY1_AUDIO_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(0) }, > + [SKY1_CI700_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(1) }, > + [SKY1_CSI_RCSU0_RESET_N] = { RESET_GROUP0_RCSU, BIT(2) }, > + [SKY1_CSI_RCSU1_RESET_N] = { RESET_GROUP0_RCSU, BIT(3) }, > + [SKY1_CSU_PM_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(4) }, > + [SKY1_DDR_BROADCAST_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(5) }, > + [SKY1_DDR_CTRL_RCSU_0_RESET_N] = { RESET_GROUP0_RCSU, BIT(6) }, > + [SKY1_DDR_CTRL_RCSU_1_RESET_N] = { RESET_GROUP0_RCSU, BIT(7) }, > + [SKY1_DDR_CTRL_RCSU_2_RESET_N] = { RESET_GROUP0_RCSU, BIT(8) }, > + [SKY1_DDR_CTRL_RCSU_3_RESET_N] = { RESET_GROUP0_RCSU, BIT(9) }, > + [SKY1_DDR_TZC400_RCSU_0_RESET_N] = { RESET_GROUP0_RCSU, BIT(10) }, > + [SKY1_DDR_TZC400_RCSU_1_RESET_N] = { RESET_GROUP0_RCSU, BIT(11) }, > + [SKY1_DDR_TZC400_RCSU_2_RESET_N] = { RESET_GROUP0_RCSU, BIT(12) }, > + [SKY1_DDR_TZC400_RCSU_3_RESET_N] = { RESET_GROUP0_RCSU, BIT(13) }, > + [SKY1_DP0_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(14) }, > + [SKY1_DP1_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(15) }, > + [SKY1_DP2_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(16) }, > + [SKY1_DP3_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(17) }, > + [SKY1_DP4_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(18) }, > + [SKY1_DPU0_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(19) }, > + [SKY1_DPU1_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(20) }, > + [SKY1_DPU2_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(21) }, > + [SKY1_DPU3_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(22) }, > + [SKY1_DPU4_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(23) }, > + [SKY1_DSU_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(24) }, > + [SKY1_FCH_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(25) }, > + [SKY1_GICD_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(26) }, > + [SKY1_GMAC_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(27) }, > + [SKY1_GPU_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(28) }, > + [SKY1_ISP_RCSU0_RESET_N] = { RESET_GROUP0_RCSU, BIT(29) }, > + [SKY1_ISP_RCSU1_RESET_N] = { RESET_GROUP0_RCSU, BIT(30) }, > + [SKY1_NI700_MMHUB_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(31) }, > + > + /* reset group1 for rcsu */ > + [SKY1_NPU_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(0) }, > + [SKY1_NI700_PCIE_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(1) }, > + [SKY1_PCIE_X421_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(2) }, > + [SKY1_PCIE_X8_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(3) }, > + [SKY1_SF_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(4) }, > + [SKY1_RCSU_SMMU_MMHUB_RESET_N] = { RESET_GROUP1_RCSU, BIT(5) }, > + [SKY1_RCSU_SMMU_PCIEHUB_RESET_N] = { RESET_GROUP1_RCSU, BIT(6) }, > + [SKY1_RCSU_SYSHUB_RESET_N] = { RESET_GROUP1_RCSU, BIT(7) }, > + [SKY1_NI700_SMN_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(8) }, > + [SKY1_NI700_SYSHUB_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(9) }, > + [SKY1_RCSU_USB2_HOST0_RESET_N] = { RESET_GROUP1_RCSU, BIT(10) }, > + [SKY1_RCSU_USB2_HOST1_RESET_N] = { RESET_GROUP1_RCSU, BIT(11) }, > + [SKY1_RCSU_USB2_HOST2_RESET_N] = { RESET_GROUP1_RCSU, BIT(12) }, > + [SKY1_RCSU_USB2_HOST3_RESET_N] = { RESET_GROUP1_RCSU, BIT(13) }, > + [SKY1_RCSU_USB3_TYPEA_DRD_RESET_N] = { RESET_GROUP1_RCSU, BIT(14) }, > + [SKY1_RCSU_USB3_TYPEC_DRD_RESET_N] = { RESET_GROUP1_RCSU, BIT(15) }, > + [SKY1_RCSU_USB3_TYPEC_HOST0_RESET_N] = { RESET_GROUP1_RCSU, BIT(16) }, > + [SKY1_RCSU_USB3_TYPEC_HOST1_RESET_N] = { RESET_GROUP1_RCSU, BIT(17) }, > + [SKY1_RCSU_USB3_TYPEC_HOST2_RESET_N] = { RESET_GROUP1_RCSU, BIT(18) }, > + [SKY1_VPU_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(19) }, > + > +}; > + > +enum { > + FCH_SW_RST_FUNC = 0x008, > + FCH_SW_RST_BUS = 0x00c, > + FCH_SW_XSPI = 0x010, > +}; > + > +static const struct sky1_src_signal sky1_src_fch_signals[SKY1_FCH_RESET_NUM] = { Same, drop SKY1_FCH_RESET_NUM. > + /* resets for fch_sw_rst_func */ > + [SW_I3C0_RST_FUNC_G_N] = { FCH_SW_RST_FUNC, BIT(0) }, > + [SW_I3C0_RST_FUNC_I_N] = { FCH_SW_RST_FUNC, BIT(1) }, > + [SW_I3C1_RST_FUNC_G_N] = { FCH_SW_RST_FUNC, BIT(2) }, > + [SW_I3C1_RST_FUNC_I_N] = { FCH_SW_RST_FUNC, BIT(3) }, > + [SW_UART0_RST_FUNC_N] = { FCH_SW_RST_FUNC, BIT(4) }, > + [SW_UART1_RST_FUNC_N] = { FCH_SW_RST_FUNC, BIT(5) }, > + [SW_UART2_RST_FUNC_N] = { FCH_SW_RST_FUNC, BIT(6) }, > + [SW_UART3_RST_FUNC_N] = { FCH_SW_RST_FUNC, BIT(7) }, > + [SW_TIMER_RST_FUNC_N] = { FCH_SW_RST_FUNC, BIT(20) }, > + > + /* resets for fch_sw_rst_bus */ > + [SW_I3C0_RST_APB_N] = { FCH_SW_RST_BUS, BIT(0) }, > + [SW_I3C1_RST_APB_N] = { FCH_SW_RST_BUS, BIT(1) }, > + [SW_DMA_RST_AXI_N] = { FCH_SW_RST_BUS, BIT(2) }, > + [SW_UART0_RST_APB_N] = { FCH_SW_RST_BUS, BIT(4) }, > + [SW_UART1_RST_APB_N] = { FCH_SW_RST_BUS, BIT(5) }, > + [SW_UART2_RST_APB_N] = { FCH_SW_RST_BUS, BIT(6) }, > + [SW_UART3_RST_APB_N] = { FCH_SW_RST_BUS, BIT(7) }, > + [SW_SPI0_RST_APB_N] = { FCH_SW_RST_BUS, BIT(8) }, > + [SW_SPI1_RST_APB_N] = { FCH_SW_RST_BUS, BIT(9) }, > + [SW_I2C0_RST_APB_N] = { FCH_SW_RST_BUS, BIT(12) }, > + [SW_I2C1_RST_APB_N] = { FCH_SW_RST_BUS, BIT(13) }, > + [SW_I2C2_RST_APB_N] = { FCH_SW_RST_BUS, BIT(14) }, > + [SW_I2C3_RST_APB_N] = { FCH_SW_RST_BUS, BIT(15) }, > + [SW_I2C4_RST_APB_N] = { FCH_SW_RST_BUS, BIT(16) }, > + [SW_I2C5_RST_APB_N] = { FCH_SW_RST_BUS, BIT(17) }, > + [SW_I2C6_RST_APB_N] = { FCH_SW_RST_BUS, BIT(18) }, > + [SW_I2C7_RST_APB_N] = { FCH_SW_RST_BUS, BIT(19) }, > + [SW_GPIO_RST_APB_N] = { FCH_SW_RST_BUS, BIT(21) }, > + > + /* resets for fch_sw_xspi */ > + [SW_XSPI_REG_RST_N] = { FCH_SW_XSPI, BIT(0) }, > + [SW_XSPI_SYS_RST_N] = { FCH_SW_XSPI, BIT(1) }, > +}; > + > +static struct sky1_src *to_sky1_src(struct reset_controller_dev *rcdev) > +{ > + return container_of(rcdev, struct sky1_src, rcdev); > +} > + > +static int sky1_reset_update(struct sky1_src *sky1src, > + unsigned long id, unsigned int value) > +{ > + const struct sky1_src_signal *signal = &sky1src->signals[id]; > + > + return regmap_update_bits(sky1src->regmap, > + signal->offset, signal->mask, value); > +} > + > +static int sky1_reset_set(struct reset_controller_dev *rcdev, > + unsigned long id, bool assert) > +{ > + struct sky1_src *sky1src = to_sky1_src(rcdev); > + unsigned int value = assert ? 0 : sky1src->signals[id].mask; > + > + return sky1_reset_update(sky1src, id, value); > +} Merge sky1_reset_update() and sky1_reset_set() into a single function. > + > +static int sky1_reset(struct reset_controller_dev *rcdev, > + unsigned long id) > +{ > + sky1_reset_set(rcdev, id, true); > + usleep_range(SKY1_RESET_SLEEP_MIN_US, > + SKY1_RESET_SLEEP_MAX_US); > + > + sky1_reset_set(rcdev, id, false); > + > + /* > + * Ensure component is taken out reset state by sleeping also after > + * deasserting the reset, Otherwise, the component may not be ready > + * for operation. > + */ > + usleep_range(SKY1_RESET_SLEEP_MIN_US, > + SKY1_RESET_SLEEP_MAX_US); Why is the delay needed here but not in sky1_reset_deassert()? > + return 0; > +} > + > +static int sky1_reset_assert(struct reset_controller_dev *rcdev, > + unsigned long id) > +{ > + return sky1_reset_set(rcdev, id, true); > +} > + > +static int sky1_reset_deassert(struct reset_controller_dev *rcdev, > + unsigned long id) > +{ > + return sky1_reset_set(rcdev, id, false); > +} > + > +static int sky1_reset_status(struct reset_controller_dev *rcdev, > + unsigned long id) > +{ > + unsigned int value = 0; > + struct sky1_src *sky1_src = to_sky1_src(rcdev); > + const struct sky1_src_signal *signal = &sky1_src->signals[id]; > + > + regmap_read(sky1_src->regmap, signal->offset, &value); > + return !(value & signal->mask); > +} > + > +static const struct reset_control_ops sky1_src_ops = { > + .reset = sky1_reset, > + .assert = sky1_reset_assert, > + .deassert = sky1_reset_deassert, > + .status = sky1_reset_status > +}; > + > +static const struct sky1_src_variant variant_sky1 = { > + .signals = sky1_src_signals, > + .signals_num = ARRAY_SIZE(sky1_src_signals), > +}; > + > +static const struct sky1_src_variant variant_sky1_fch = { > + .signals = sky1_src_fch_signals, > + .signals_num = ARRAY_SIZE(sky1_src_fch_signals), > +}; > + > +static const struct regmap_config sky1_src_config = { > + .reg_bits = 32, > + .val_bits = 32, > + .reg_stride = 4, > + .name = "src", > +}; > + > +static int sky1_reset_probe(struct platform_device *pdev) > +{ > + struct sky1_src *sky1src; > + struct device *dev = &pdev->dev; > + void __iomem *base; > + const struct sky1_src_variant *variant = device_get_match_data(dev); > + > + sky1src = devm_kzalloc(dev, sizeof(*sky1src), GFP_KERNEL); > + if (!sky1src) > + return -ENOMEM; > + > + base = devm_platform_ioremap_resource(pdev, 0); > + if (IS_ERR(base)) > + return PTR_ERR(base); > + > + sky1src->regmap = devm_regmap_init_mmio(dev, base, &sky1_src_config); > + if (IS_ERR(sky1src->regmap)) { > + dev_err(dev, "Unable to get sky1-src regmap"); I'd use dev_err_probe() to also print the error value. regards Philipp ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 3/3] dts: reset: add support for cix sky1 resets 2025-11-07 3:38 [PATCH 0/3] Add support for Cix Sky1 resets Gary Yang 2025-11-07 3:38 ` [PATCH 1/3] dt-bindings: reset: add sky1 reset controller Gary Yang 2025-11-07 3:38 ` [PATCH 2/3] Reset: cix: add support for cix sky1 resets Gary Yang @ 2025-11-07 3:38 ` Gary Yang 2025-11-07 7:19 ` Krzysztof Kozlowski 2 siblings, 1 reply; 17+ messages in thread From: Gary Yang @ 2025-11-07 3:38 UTC (permalink / raw) To: p.zabel, robh, krzk+dt, conor+dt Cc: devicetree, linux-kernel, linux-arm-kernel, cix-kernel-upstream, Gary Yang There are two reset conctrollers on Cix Sky1 Soc. One is located in S0 domain, and the other is located in S5 domain. Signed-off-by: Gary Yang <gary.yang@cixtech.com> --- arch/arm64/boot/dts/cix/sky1.dtsi | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/arch/arm64/boot/dts/cix/sky1.dtsi b/arch/arm64/boot/dts/cix/sky1.dtsi index d21387224e79..fc68734f37c2 100644 --- a/arch/arm64/boot/dts/cix/sky1.dtsi +++ b/arch/arm64/boot/dts/cix/sky1.dtsi @@ -348,6 +348,13 @@ i3c1: i3c@4100000 { status = "disabled"; }; + src_fch: reset-controller@4160000 { + compatible = "cix,sky1-rst-fch", "syscon"; + reg = <0x0 0x04160000 0x0 0x90>; + #reset-cells = <1>; + status = "okay"; + }; + iomuxc: pinctrl@4170000 { compatible = "cix,sky1-iomuxc"; reg = <0x0 0x04170000 0x0 0x1000>; @@ -568,6 +575,13 @@ ppi_partition1: interrupt-partition-1 { }; }; + src: reset-controller@16000000 { + compatible = "cix,sky1-rst", "syscon"; + reg = <0x0 0x16000000 0x0 0x1000>; + #reset-cells = <1>; + status = "okay"; + }; + iomuxc_s5: pinctrl@16007000 { compatible = "cix,sky1-iomuxc-s5"; reg = <0x0 0x16007000 0x0 0x1000>; -- 2.49.0 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 3/3] dts: reset: add support for cix sky1 resets 2025-11-07 3:38 ` [PATCH 3/3] dts: reset: " Gary Yang @ 2025-11-07 7:19 ` Krzysztof Kozlowski 2025-11-10 11:22 ` 回复: " Gary Yang 0 siblings, 1 reply; 17+ messages in thread From: Krzysztof Kozlowski @ 2025-11-07 7:19 UTC (permalink / raw) To: Gary Yang, p.zabel, robh, krzk+dt, conor+dt Cc: devicetree, linux-kernel, linux-arm-kernel, cix-kernel-upstream On 07/11/2025 04:38, Gary Yang wrote: > There are two reset conctrollers on Cix Sky1 Soc. > One is located in S0 domain, and the other is located > in S5 domain. > > Signed-off-by: Gary Yang <gary.yang@cixtech.com> > --- > arch/arm64/boot/dts/cix/sky1.dtsi | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) Please use subject prefixes matching the subsystem. You can get them for example with `git log --oneline -- DIRECTORY_OR_FILE` on the directory your patch is touching. For bindings, the preferred subjects are explained here: https://www.kernel.org/doc/html/latest/devicetree/bindings/submitting-patches.html#i-for-patch-submitters Please start paying attention to this. > > diff --git a/arch/arm64/boot/dts/cix/sky1.dtsi b/arch/arm64/boot/dts/cix/sky1.dtsi > index d21387224e79..fc68734f37c2 100644 > --- a/arch/arm64/boot/dts/cix/sky1.dtsi > +++ b/arch/arm64/boot/dts/cix/sky1.dtsi > @@ -348,6 +348,13 @@ i3c1: i3c@4100000 { > status = "disabled"; > }; > > + src_fch: reset-controller@4160000 { > + compatible = "cix,sky1-rst-fch", "syscon"; > + reg = <0x0 0x04160000 0x0 0x90>; > + #reset-cells = <1>; > + status = "okay"; Why? > + }; > + > iomuxc: pinctrl@4170000 { > compatible = "cix,sky1-iomuxc"; > reg = <0x0 0x04170000 0x0 0x1000>; > @@ -568,6 +575,13 @@ ppi_partition1: interrupt-partition-1 { > }; > }; > > + src: reset-controller@16000000 { > + compatible = "cix,sky1-rst", "syscon"; > + reg = <0x0 0x16000000 0x0 0x1000>; > + #reset-cells = <1>; > + status = "okay"; No, really, why? Best regards, Krzysztof ^ permalink raw reply [flat|nested] 17+ messages in thread
* 回复: [PATCH 3/3] dts: reset: add support for cix sky1 resets 2025-11-07 7:19 ` Krzysztof Kozlowski @ 2025-11-10 11:22 ` Gary Yang 0 siblings, 0 replies; 17+ messages in thread From: Gary Yang @ 2025-11-10 11:22 UTC (permalink / raw) To: Krzysztof Kozlowski, p.zabel@pengutronix.de, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, cix-kernel-upstream Hi Krzysztof: > -----邮件原件----- > 发件人: Krzysztof Kozlowski <krzk@kernel.org> > 发送时间: 2025年11月7日 15:20 > 收件人: Gary Yang <gary.yang@cixtech.com>; p.zabel@pengutronix.de; > robh@kernel.org; krzk+dt@kernel.org; conor+dt@kernel.org > 抄送: devicetree@vger.kernel.org; linux-kernel@vger.kernel.org; > linux-arm-kernel@lists.infradead.org; cix-kernel-upstream > <cix-kernel-upstream@cixtech.com> > 主题: Re: [PATCH 3/3] dts: reset: add support for cix sky1 resets > > EXTERNAL EMAIL > > On 07/11/2025 04:38, Gary Yang wrote: > > There are two reset conctrollers on Cix Sky1 Soc. > > One is located in S0 domain, and the other is located in S5 domain. > > > > Signed-off-by: Gary Yang <gary.yang@cixtech.com> > > --- > > arch/arm64/boot/dts/cix/sky1.dtsi | 14 ++++++++++++++ > > 1 file changed, 14 insertions(+) > > > Please use subject prefixes matching the subsystem. You can get them for > example with `git log --oneline -- DIRECTORY_OR_FILE` on the directory your > patch is touching. For bindings, the preferred subjects are explained here: > https://www.kernel.org/doc/html/latest/devicetree/bindings/submitting-patch > es.html#i-for-patch-submitters > > Please start paying attention to this. > Ok, we will use " arm64: dts: cix: add support for cix sky1 resets ". All right? > > > > diff --git a/arch/arm64/boot/dts/cix/sky1.dtsi > > b/arch/arm64/boot/dts/cix/sky1.dtsi > > index d21387224e79..fc68734f37c2 100644 > > --- a/arch/arm64/boot/dts/cix/sky1.dtsi > > +++ b/arch/arm64/boot/dts/cix/sky1.dtsi > > @@ -348,6 +348,13 @@ i3c1: i3c@4100000 { > > status = "disabled"; > > }; > > > > + src_fch: reset-controller@4160000 { > > + compatible = "cix,sky1-rst-fch", "syscon"; > > + reg = <0x0 0x04160000 0x0 0x90>; > > + #reset-cells = <1>; > > + status = "okay"; > Why? Sorry, We will delete status property > > > + }; > > + > > iomuxc: pinctrl@4170000 { > > compatible = "cix,sky1-iomuxc"; > > reg = <0x0 0x04170000 0x0 0x1000>; @@ -568,6 > > +575,13 @@ ppi_partition1: interrupt-partition-1 { > > }; > > }; > > > > + src: reset-controller@16000000 { > > + compatible = "cix,sky1-rst", "syscon"; > > + reg = <0x0 0x16000000 0x0 0x1000>; > > + #reset-cells = <1>; > > + status = "okay"; > > No, really, why? > Sorry, We will delete status property Best wishes Gary > > Best regards, > Krzysztof ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2025-11-10 12:11 UTC | newest] Thread overview: 17+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-11-07 3:38 [PATCH 0/3] Add support for Cix Sky1 resets Gary Yang 2025-11-07 3:38 ` [PATCH 1/3] dt-bindings: reset: add sky1 reset controller Gary Yang 2025-11-07 7:17 ` Krzysztof Kozlowski 2025-11-10 5:56 ` 回复: " Gary Yang 2025-11-07 13:25 ` Philipp Zabel 2025-11-10 6:43 ` 回复: " Gary Yang 2025-11-07 3:38 ` [PATCH 2/3] Reset: cix: add support for cix sky1 resets Gary Yang 2025-11-07 7:19 ` Krzysztof Kozlowski 2025-11-10 11:18 ` 回复: " Gary Yang 2025-11-10 11:22 ` Krzysztof Kozlowski 2025-11-10 11:32 ` 回复: " Gary Yang 2025-11-10 11:38 ` Krzysztof Kozlowski 2025-11-10 12:11 ` 回复: " Gary Yang 2025-11-07 13:25 ` Philipp Zabel 2025-11-07 3:38 ` [PATCH 3/3] dts: reset: " Gary Yang 2025-11-07 7:19 ` Krzysztof Kozlowski 2025-11-10 11:22 ` 回复: " Gary Yang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).