* [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
* [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
* [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 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
* 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
* 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
* 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
* 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 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
* 回复: [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 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 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
* 回复: 回复: [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
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).