devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/2] Add driver support for ESWIN eic7700 SoC reset controller
@ 2025-07-15 12:14 dongxuyang
  2025-07-15 12:15 ` [PATCH v4 1/2] dt-bindings: reset: eswin: Documentation for eic7700 SoC dongxuyang
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: dongxuyang @ 2025-07-15 12:14 UTC (permalink / raw)
  To: p.zabel, robh, krzk+dt, conor+dt, devicetree, linux-kernel
  Cc: ningyu, linmin, huangyifeng, pinkesh.vaghela, Xuyang Dong

From: Xuyang Dong <dongxuyang@eswincomputing.com>

Updates:

  dt-bindings: reset: eswin: Documentation for eic7700 SoC
  v3 -> v4:
    1. Remove register offsets in dt-bindings.
    2. Changed the const value of "#reset-cells" from 2 to 1.
       Because the offsets were removed from dt-bindings. There are
       only IDs. And removed the description of it.
    3. Modify copyright year from 2024 to 2025.
    4. Redefined the IDs in the dt-bindings and used these to build a
       reset array in reset driver. Ensure that the reset register and
       reset value corresponding to the IDs are correct.
    Link to v3: https://lore.kernel.org/all/20250624103212.287-1-dongxuyang@eswincomputing.com/

  v2 -> v3:
    1. Drop syscon and simple-mfd from yaml and code, because these are
       not necessary.
    2. Update description to introduce reset controller.
    3. Add reset control indices for dt-bindings.
    4. Keep the register offsets in dt-bindings.
    Link to v2: https://lore.kernel.org/all/20250523090747.1830-1-dongxuyang@eswincomputing.com/

  v1 -> v2:
    1. Clear warnings/errors for using "make dt_binding_check".
    2. Update example, change parent node from sys-crg to reset-controller
       for reset yaml.
    3. Drop the child node and add '#reset-cells' to the parent node.
    4. Drop the description, because sys-crg block is changed to reset-
       controller.
    5. Change hex numbers to decimal numbers going from 0, and drop the
       not needed hardware numbers.
    Link to v1: https://lore.kernel.org/all/20250514002233.187-1-dongxuyang@eswincomputing.com/

  reset: eswin: Add eic7700 reset driver
  v3 -> v4:
    1. Add 'const' for the definition. It is 'const struct of_phandle_
       args *reset_spec = data;'.
    2. Modify copyright year from 2024 to 2025.
    3. Included "eswin,eic7700-reset.h" in reset driver.
    4. Added mapping table for reset IDs.
    5. Removed of_xlate and idr functions as we are using IDs from DTS.
    6. Removed .remove function.
    Link to v3: https://lore.kernel.org/all/20250624103212.287-1-dongxuyang@eswincomputing.com/

  v2 -> v3:
    1. Change syscon_node_to_regmap() to MMIO regmap functions, because
       dropped syscon.
    2. Add BIT() in function eswin_reset_set() to shift the reset
       control indices.
    3. Remove forced type conversions from function eswin_reset_of_
       xlate_lookup_id().
    Link to v2: https://lore.kernel.org/all/20250523090747.1830-1-dongxuyang@eswincomputing.com/

  v1 -> v2:
    1. Modify the code according to the suggestions.
    2. Use eswin_reset_assert() and eswin_reset_deassert in function
       eswin_reset_reset().
    3. Place RESET_EIC7700 in Kconfig and Makefile in order.
    4. Use dev_err_probe() in probe function.
    Link to v1: https://lore.kernel.org/all/20250514002233.187-1-dongxuyang@eswincomputing.com/

Xuyang Dong (2):
  dt-bindings: reset: eswin: Documentation for eic7700 SoC
  reset: eswin: Add eic7700 reset driver

 .../bindings/reset/eswin,eic7700-reset.yaml   |  42 ++
 drivers/reset/Kconfig                         |  10 +
 drivers/reset/Makefile                        |   1 +
 drivers/reset/reset-eic7700.c                 | 454 ++++++++++++++++++
 .../dt-bindings/reset/eswin,eic7700-reset.h   | 299 ++++++++++++
 5 files changed, 806 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/reset/eswin,eic7700-reset.yaml
 create mode 100644 drivers/reset/reset-eic7700.c
 create mode 100644 include/dt-bindings/reset/eswin,eic7700-reset.h

--
2.17.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v4 1/2] dt-bindings: reset: eswin: Documentation for eic7700 SoC
  2025-07-15 12:14 [PATCH v4 0/2] Add driver support for ESWIN eic7700 SoC reset controller dongxuyang
@ 2025-07-15 12:15 ` dongxuyang
  2025-07-15 15:49   ` Krzysztof Kozlowski
  2025-07-15 12:15 ` [PATCH v4 2/2] reset: eswin: Add eic7700 reset driver dongxuyang
  2025-07-15 15:47 ` [PATCH v4 0/2] Add driver support for ESWIN eic7700 SoC reset controller Krzysztof Kozlowski
  2 siblings, 1 reply; 6+ messages in thread
From: dongxuyang @ 2025-07-15 12:15 UTC (permalink / raw)
  To: p.zabel, robh, krzk+dt, conor+dt, devicetree, linux-kernel
  Cc: ningyu, linmin, huangyifeng, pinkesh.vaghela, Xuyang Dong

From: Xuyang Dong <dongxuyang@eswincomputing.com>

Add device tree binding documentation and header file for the ESWIN
eic7700 reset controller module.

Signed-off-by: Yifeng Huang <huangyifeng@eswincomputing.com>
Signed-off-by: Xuyang Dong <dongxuyang@eswincomputing.com>
---
 .../bindings/reset/eswin,eic7700-reset.yaml   |  42 +++
 .../dt-bindings/reset/eswin,eic7700-reset.h   | 299 ++++++++++++++++++
 2 files changed, 341 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/reset/eswin,eic7700-reset.yaml
 create mode 100644 include/dt-bindings/reset/eswin,eic7700-reset.h

diff --git a/Documentation/devicetree/bindings/reset/eswin,eic7700-reset.yaml b/Documentation/devicetree/bindings/reset/eswin,eic7700-reset.yaml
new file mode 100644
index 000000000000..d05a0531dce3
--- /dev/null
+++ b/Documentation/devicetree/bindings/reset/eswin,eic7700-reset.yaml
@@ -0,0 +1,42 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/reset/eswin,eic7700-reset.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: ESWIN EIC7700 SoC reset controller
+
+maintainers:
+  - Yifeng Huang <huangyifeng@eswincomputing.com>
+  - Xuyang Dong <dongxuyang@eswincomputing.com>
+
+description:
+  The system reset controller can be used to reset various peripheral
+  controllers in ESWIN eic7700 SoC.
+
+properties:
+  compatible:
+    const: eswin,eic7700-reset
+
+  reg:
+    maxItems: 1
+
+  '#reset-cells':
+    const: 1
+
+required:
+  - compatible
+  - reg
+  - '#reset-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/reset/eswin,eic7700-reset.h>
+
+    reset-controller@51828000 {
+        compatible = "eswin,eic7700-reset";
+        reg = <0x51828000 0x80000>;
+        #reset-cells = <1>;
+    };
diff --git a/include/dt-bindings/reset/eswin,eic7700-reset.h b/include/dt-bindings/reset/eswin,eic7700-reset.h
new file mode 100644
index 000000000000..3450d04f04da
--- /dev/null
+++ b/include/dt-bindings/reset/eswin,eic7700-reset.h
@@ -0,0 +1,299 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright 2025, Beijing ESWIN Computing Technology Co., Ltd..
+ * All rights reserved.
+ *
+ * Device Tree binding constants for EIC7700 reset controller.
+ *
+ * Authors:
+ *	Yifeng Huang <huangyifeng@eswincomputing.com>
+ *	Xuyang Dong <dongxuyang@eswincomputing.com>
+ */
+
+#ifndef __DT_ESWIN_EIC7700_RESET_H__
+#define __DT_ESWIN_EIC7700_RESET_H__
+
+#define EIC7700_RESET_NOC_NSP			0
+#define EIC7700_RESET_NOC_CFG			1
+#define EIC7700_RESET_RNOC_NSP			2
+#define EIC7700_RESET_SNOC_TCU			3
+#define EIC7700_RESET_SNOC_U84			4
+#define EIC7700_RESET_SNOC_PCIE_XSR		5
+#define EIC7700_RESET_SNOC_PCIE_XMR		6
+#define EIC7700_RESET_SNOC_PCIE_PR		7
+#define EIC7700_RESET_SNOC_NPU			8
+#define EIC7700_RESET_SNOC_JTAG			9
+#define EIC7700_RESET_SNOC_DSP			10
+#define EIC7700_RESET_SNOC_DDRC1_P2		11
+#define EIC7700_RESET_SNOC_DDRC1_P1		12
+#define EIC7700_RESET_SNOC_DDRC0_P2		13
+#define EIC7700_RESET_SNOC_DDRC0_P1		14
+#define EIC7700_RESET_SNOC_D2D			15
+#define EIC7700_RESET_SNOC_AON			16
+#define EIC7700_RESET_GPU_AXI			17
+#define EIC7700_RESET_GPU_CFG			18
+#define EIC7700_RESET_GPU_GRAY			19
+#define EIC7700_RESET_GPU_JONES			20
+#define EIC7700_RESET_GPU_SPU			21
+#define EIC7700_RESET_DSP_AXI			22
+#define EIC7700_RESET_DSP_CFG			23
+#define EIC7700_RESET_DSP_DIV4			24
+#define EIC7700_RESET_DSP_DIV0			25
+#define EIC7700_RESET_DSP_DIV1			26
+#define EIC7700_RESET_DSP_DIV2			27
+#define EIC7700_RESET_DSP_DIV3			28
+#define EIC7700_RESET_D2D_AXI			29
+#define EIC7700_RESET_D2D_CFG			30
+#define EIC7700_RESET_D2D_PRST			31
+#define EIC7700_RESET_D2D_RAW_PCS		32
+#define EIC7700_RESET_D2D_RX			33
+#define EIC7700_RESET_D2D_TX			34
+#define EIC7700_RESET_D2D_CORE			35
+#define EIC7700_RESET_DDR1_ARST			36
+#define EIC7700_RESET_DDR1_TRACE		37
+#define EIC7700_RESET_DDR0_ARST			38
+#define EIC7700_RESET_DDR_CFG			39
+#define EIC7700_RESET_DDR0_TRACE		40
+#define EIC7700_RESET_DDR_CORE			41
+#define EIC7700_RESET_DDR_PRST			42
+#define EIC7700_RESET_TCU_AXI			43
+#define EIC7700_RESET_TCU_CFG			44
+#define EIC7700_RESET_TCU_TBU0			45
+#define EIC7700_RESET_TCU_TBU1			46
+#define EIC7700_RESET_TCU_TBU2			47
+#define EIC7700_RESET_TCU_TBU3			48
+#define EIC7700_RESET_TCU_TBU4			49
+#define EIC7700_RESET_TCU_TBU5			50
+#define EIC7700_RESET_TCU_TBU6			51
+#define EIC7700_RESET_TCU_TBU7			52
+#define EIC7700_RESET_TCU_TBU8			53
+#define EIC7700_RESET_TCU_TBU9			54
+#define EIC7700_RESET_TCU_TBU10			55
+#define EIC7700_RESET_TCU_TBU11			56
+#define EIC7700_RESET_TCU_TBU12			57
+#define EIC7700_RESET_TCU_TBU13			58
+#define EIC7700_RESET_TCU_TBU14			59
+#define EIC7700_RESET_TCU_TBU15			60
+#define EIC7700_RESET_TCU_TBU16			61
+#define EIC7700_RESET_NPU_AXI			62
+#define EIC7700_RESET_NPU_CFG			63
+#define EIC7700_RESET_NPU_CORE			64
+#define EIC7700_RESET_NPU_E31CORE		65
+#define EIC7700_RESET_NPU_E31BUS		66
+#define EIC7700_RESET_NPU_E31DBG		67
+#define EIC7700_RESET_NPU_LLC			68
+#define EIC7700_RESET_HSP_AXI			69
+#define EIC7700_RESET_HSP_CFG			70
+#define EIC7700_RESET_HSP_POR			71
+#define EIC7700_RESET_MSHC0_PHY			72
+#define EIC7700_RESET_MSHC1_PHY			73
+#define EIC7700_RESET_MSHC2_PHY			74
+#define EIC7700_RESET_MSHC0_TXRX		75
+#define EIC7700_RESET_MSHC1_TXRX		76
+#define EIC7700_RESET_MSHC2_TXRX		77
+#define EIC7700_RESET_SATA_ASIC0		78
+#define EIC7700_RESET_SATA_OOB			79
+#define EIC7700_RESET_SATA_PMALIVE		80
+#define EIC7700_RESET_SATA_RBC			81
+#define EIC7700_RESET_DMA0				82
+#define EIC7700_RESET_HSP_DMA			83
+#define EIC7700_RESET_USB0_VAUX			84
+#define EIC7700_RESET_USB1_VAUX			85
+#define EIC7700_RESET_HSP_SD1_PRST		86
+#define EIC7700_RESET_HSP_SD0_PRST		87
+#define EIC7700_RESET_HSP_EMMC_PRST		88
+#define EIC7700_RESET_HSP_DMA_PRST		89
+#define EIC7700_RESET_HSP_SD1_ARST		90
+#define EIC7700_RESET_HSP_SD0_ARST		91
+#define EIC7700_RESET_HSP_EMMC_ARST		92
+#define EIC7700_RESET_HSP_DMA_ARST		93
+#define EIC7700_RESET_HSP_ETH1_ARST		94
+#define EIC7700_RESET_HSP_ETH0_ARST		95
+#define EIC7700_RESET_SATA_ARST			96
+#define EIC7700_RESET_PCIE_CFG			97
+#define EIC7700_RESET_PCIE_POWEUP		98
+#define EIC7700_RESET_PCIE_PERST		99
+#define EIC7700_RESET_I2C0				100
+#define EIC7700_RESET_I2C1				101
+#define EIC7700_RESET_I2C2				102
+#define EIC7700_RESET_I2C3				103
+#define EIC7700_RESET_I2C4				104
+#define EIC7700_RESET_I2C5				105
+#define EIC7700_RESET_I2C6				106
+#define EIC7700_RESET_I2C7				107
+#define EIC7700_RESET_I2C8				108
+#define EIC7700_RESET_I2C9				109
+#define EIC7700_RESET_FAN				110
+#define EIC7700_RESET_PVT0				111
+#define EIC7700_RESET_PVT1				112
+#define EIC7700_RESET_MBOX0				113
+#define EIC7700_RESET_MBOX1				114
+#define EIC7700_RESET_MBOX2				115
+#define EIC7700_RESET_MBOX3				116
+#define EIC7700_RESET_MBOX4				117
+#define EIC7700_RESET_MBOX5				118
+#define EIC7700_RESET_MBOX6				119
+#define EIC7700_RESET_MBOX7				120
+#define EIC7700_RESET_MBOX8				121
+#define EIC7700_RESET_MBOX9				122
+#define EIC7700_RESET_MBOX10			123
+#define EIC7700_RESET_MBOX11			124
+#define EIC7700_RESET_MBOX12			125
+#define EIC7700_RESET_MBOX13			126
+#define EIC7700_RESET_MBOX14			127
+#define EIC7700_RESET_MBOX15			128
+#define EIC7700_RESET_UART0				129
+#define EIC7700_RESET_UART1				130
+#define EIC7700_RESET_UART2				131
+#define EIC7700_RESET_UART3				132
+#define EIC7700_RESET_UART4				133
+#define EIC7700_RESET_GPIO0				134
+#define EIC7700_RESET_GPIO1				135
+#define EIC7700_RESET_TIMER				136
+#define EIC7700_RESET_SSI0				137
+#define EIC7700_RESET_SSI1				138
+#define EIC7700_RESET_WDT0				139
+#define EIC7700_RESET_WDT1				140
+#define EIC7700_RESET_WDT2				141
+#define EIC7700_RESET_WDT3				142
+#define EIC7700_RESET_LSP_CFG			143
+#define EIC7700_RESET_U84_CORE0			144
+#define EIC7700_RESET_U84_CORE1			145
+#define EIC7700_RESET_U84_CORE2			146
+#define EIC7700_RESET_U84_CORE3			147
+#define EIC7700_RESET_U84_BUS			148
+#define EIC7700_RESET_U84_DBG			149
+#define EIC7700_RESET_U84_TRACECOM		150
+#define EIC7700_RESET_U84_TRACE0		151
+#define EIC7700_RESET_U84_TRACE1		152
+#define EIC7700_RESET_U84_TRACE2		153
+#define EIC7700_RESET_U84_TRACE3		154
+#define EIC7700_RESET_SCPU_CORE			155
+#define EIC7700_RESET_SCPU_BUS			156
+#define EIC7700_RESET_SCPU_DBG			157
+#define EIC7700_RESET_LPCPU_CORE		158
+#define EIC7700_RESET_LPCPU_BUS			159
+#define EIC7700_RESET_LPCPU_DBG			160
+#define EIC7700_RESET_VC_CFG			161
+#define EIC7700_RESET_VC_AXI			162
+#define EIC7700_RESET_VC_MONCFG			163
+#define EIC7700_RESET_JD_CFG			164
+#define EIC7700_RESET_JD_AXI			165
+#define EIC7700_RESET_JE_CFG			166
+#define EIC7700_RESET_JE_AXI			167
+#define EIC7700_RESET_VD_CFG			168
+#define EIC7700_RESET_VD_AXI			169
+#define EIC7700_RESET_VE_AXI			170
+#define EIC7700_RESET_VE_CFG			171
+#define EIC7700_RESET_G2D_CORE			172
+#define EIC7700_RESET_G2D_CFG			173
+#define EIC7700_RESET_G2D_AXI			174
+#define EIC7700_RESET_VI_AXI			175
+#define EIC7700_RESET_VI_CFG			176
+#define EIC7700_RESET_VI_DWE			177
+#define EIC7700_RESET_DVP				178
+#define EIC7700_RESET_ISP0				179
+#define EIC7700_RESET_ISP1				180
+#define EIC7700_RESET_SHUTTR0			181
+#define EIC7700_RESET_SHUTTR1			182
+#define EIC7700_RESET_SHUTTR2			183
+#define EIC7700_RESET_SHUTTR3			184
+#define EIC7700_RESET_SHUTTR4			185
+#define EIC7700_RESET_SHUTTR5			186
+#define EIC7700_RESET_VO_MIPI			187
+#define EIC7700_RESET_VO_PRST			188
+#define EIC7700_RESET_VO_HDMI_PRST		189
+#define EIC7700_RESET_VO_HDMI_PHY		190
+#define EIC7700_RESET_VO_HDMI			191
+#define EIC7700_RESET_VO_I2S			192
+#define EIC7700_RESET_VO_I2S_PRST		193
+#define EIC7700_RESET_VO_AXI			194
+#define EIC7700_RESET_VO_CFG			195
+#define EIC7700_RESET_VO_DC				196
+#define EIC7700_RESET_VO_DC_PRST		197
+#define EIC7700_RESET_BOOTSPI_HRST		198
+#define EIC7700_RESET_BOOTSPI			199
+#define EIC7700_RESET_ANO1				200
+#define EIC7700_RESET_ANO0				201
+#define EIC7700_RESET_DMA1_ARST			202
+#define EIC7700_RESET_DMA1_HRST			203
+#define EIC7700_RESET_FPRT				204
+#define EIC7700_RESET_HBLOCK			205
+#define EIC7700_RESET_SECSR				206
+#define EIC7700_RESET_OTP				207
+#define EIC7700_RESET_PKA				208
+#define EIC7700_RESET_SPACC				209
+#define EIC7700_RESET_TRNG				210
+#define EIC7700_RESET_TIMER0_0			211
+#define EIC7700_RESET_TIMER0_1			212
+#define EIC7700_RESET_TIMER0_2			213
+#define EIC7700_RESET_TIMER0_3			214
+#define EIC7700_RESET_TIMER0_4			215
+#define EIC7700_RESET_TIMER0_5			216
+#define EIC7700_RESET_TIMER0_6			217
+#define EIC7700_RESET_TIMER0_7			218
+#define EIC7700_RESET_TIMER0_N			219
+#define EIC7700_RESET_TIMER1_0			220
+#define EIC7700_RESET_TIMER1_1			221
+#define EIC7700_RESET_TIMER1_2			222
+#define EIC7700_RESET_TIMER1_3			223
+#define EIC7700_RESET_TIMER1_4			224
+#define EIC7700_RESET_TIMER1_5			225
+#define EIC7700_RESET_TIMER1_6			226
+#define EIC7700_RESET_TIMER1_7			227
+#define EIC7700_RESET_TIMER1_N			228
+#define EIC7700_RESET_TIMER2_0			229
+#define EIC7700_RESET_TIMER2_1			230
+#define EIC7700_RESET_TIMER2_2			231
+#define EIC7700_RESET_TIMER2_3			232
+#define EIC7700_RESET_TIMER2_4			233
+#define EIC7700_RESET_TIMER2_5			234
+#define EIC7700_RESET_TIMER2_6			235
+#define EIC7700_RESET_TIMER2_7			236
+#define EIC7700_RESET_TIMER2_N			237
+#define EIC7700_RESET_TIMER3_0			238
+#define EIC7700_RESET_TIMER3_1			239
+#define EIC7700_RESET_TIMER3_2			240
+#define EIC7700_RESET_TIMER3_3			241
+#define EIC7700_RESET_TIMER3_4			242
+#define EIC7700_RESET_TIMER3_5			243
+#define EIC7700_RESET_TIMER3_6			244
+#define EIC7700_RESET_TIMER3_7			245
+#define EIC7700_RESET_TIMER3_N			246
+#define EIC7700_RESET_RTC				247
+#define EIC7700_RESET_MNOC_SNOC_NSP		248
+#define EIC7700_RESET_MNOC_VC			249
+#define EIC7700_RESET_MNOC_CFG			250
+#define EIC7700_RESET_MNOC_HSP			251
+#define EIC7700_RESET_MNOC_GPU			252
+#define EIC7700_RESET_MNOC_DDRC1_P3		253
+#define EIC7700_RESET_MNOC_DDRC0_P3		254
+#define EIC7700_RESET_RNOC_VO			255
+#define EIC7700_RESET_RNOC_VI			256
+#define EIC7700_RESET_RNOC_SNOC_NSP		257
+#define EIC7700_RESET_RNOC_CFG			258
+#define EIC7700_RESET_MNOC_DDRC1_P4		259
+#define EIC7700_RESET_MNOC_DDRC0_P4		260
+#define EIC7700_RESET_CNOC_VO_CFG		261
+#define EIC7700_RESET_CNOC_VI_CFG		262
+#define EIC7700_RESET_CNOC_VC_CFG		263
+#define EIC7700_RESET_CNOC_TCU_CFG		264
+#define EIC7700_RESET_CNOC_PCIE_CFG		265
+#define EIC7700_RESET_CNOC_NPU_CFG		266
+#define EIC7700_RESET_CNOC_LSP_CFG		267
+#define EIC7700_RESET_CNOC_HSP_CFG		268
+#define EIC7700_RESET_CNOC_GPU_CFG		269
+#define EIC7700_RESET_CNOC_DSPT_CFG		270
+#define EIC7700_RESET_CNOC_DDRT1_CFG	271
+#define EIC7700_RESET_CNOC_DDRT0_CFG	272
+#define EIC7700_RESET_CNOC_D2D_CFG		273
+#define EIC7700_RESET_CNOC_CFG			274
+#define EIC7700_RESET_CNOC_CLMM_CFG		275
+#define EIC7700_RESET_CNOC_AON_CFG		276
+#define EIC7700_RESET_LNOC_CFG			277
+#define EIC7700_RESET_LNOC_NPU_LLC		278
+#define EIC7700_RESET_LNOC_DDRC1_P0		279
+#define EIC7700_RESET_LNOC_DDRC0_P0		280
+#define EIC7700_RESET_MAX				281
+
+#endif /* __DT_ESWIN_EIC7700_RESET_H__ */
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v4 2/2] reset: eswin: Add eic7700 reset driver
  2025-07-15 12:14 [PATCH v4 0/2] Add driver support for ESWIN eic7700 SoC reset controller dongxuyang
  2025-07-15 12:15 ` [PATCH v4 1/2] dt-bindings: reset: eswin: Documentation for eic7700 SoC dongxuyang
@ 2025-07-15 12:15 ` dongxuyang
  2025-07-15 13:37   ` Philipp Zabel
  2025-07-15 15:47 ` [PATCH v4 0/2] Add driver support for ESWIN eic7700 SoC reset controller Krzysztof Kozlowski
  2 siblings, 1 reply; 6+ messages in thread
From: dongxuyang @ 2025-07-15 12:15 UTC (permalink / raw)
  To: p.zabel, robh, krzk+dt, conor+dt, devicetree, linux-kernel
  Cc: ningyu, linmin, huangyifeng, pinkesh.vaghela, Xuyang Dong

From: Xuyang Dong <dongxuyang@eswincomputing.com>

Add support for reset controller in eic7700 series chips.
Provide functionality for asserting and deasserting resets
on the chip.

Signed-off-by: Yifeng Huang <huangyifeng@eswincomputing.com>
Signed-off-by: Xuyang Dong <dongxuyang@eswincomputing.com>
---
 drivers/reset/Kconfig         |  10 +
 drivers/reset/Makefile        |   1 +
 drivers/reset/reset-eic7700.c | 454 ++++++++++++++++++++++++++++++++++
 3 files changed, 465 insertions(+)
 create mode 100644 drivers/reset/reset-eic7700.c

diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
index d85be5899da6..82f829f4c9f0 100644
--- a/drivers/reset/Kconfig
+++ b/drivers/reset/Kconfig
@@ -66,6 +66,16 @@ config RESET_BRCMSTB_RESCAL
 	  This enables the RESCAL reset controller for SATA, PCIe0, or PCIe1 on
 	  BCM7216.
 
+config RESET_EIC7700
+	bool "Reset controller driver for ESWIN SoCs"
+	depends on ARCH_ESWIN || COMPILE_TEST
+	default ARCH_ESWIN
+	help
+	  This enables the reset controller driver for ESWIN SoCs. This driver is
+	  specific to ESWIN SoCs and should only be enabled if using such hardware.
+	  The driver supports eic7700 series chips and provides functionality for
+	  asserting and deasserting resets on the chip.
+
 config RESET_EYEQ
 	bool "Mobileye EyeQ reset controller"
 	depends on MACH_EYEQ5 || MACH_EYEQ6H || COMPILE_TEST
diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
index 91e6348e3351..ceafbad0555c 100644
--- a/drivers/reset/Makefile
+++ b/drivers/reset/Makefile
@@ -12,6 +12,7 @@ obj-$(CONFIG_RESET_BCM6345) += reset-bcm6345.o
 obj-$(CONFIG_RESET_BERLIN) += reset-berlin.o
 obj-$(CONFIG_RESET_BRCMSTB) += reset-brcmstb.o
 obj-$(CONFIG_RESET_BRCMSTB_RESCAL) += reset-brcmstb-rescal.o
+obj-$(CONFIG_RESET_EIC7700) += reset-eic7700.o
 obj-$(CONFIG_RESET_EYEQ) += reset-eyeq.o
 obj-$(CONFIG_RESET_GPIO) += reset-gpio.o
 obj-$(CONFIG_RESET_HSDK) += reset-hsdk.o
diff --git a/drivers/reset/reset-eic7700.c b/drivers/reset/reset-eic7700.c
new file mode 100644
index 000000000000..1acc531343b0
--- /dev/null
+++ b/drivers/reset/reset-eic7700.c
@@ -0,0 +1,454 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright 2025, Beijing ESWIN Computing Technology Co., Ltd..
+ * All rights reserved.
+ *
+ * ESWIN Reset Driver
+ *
+ * Authors:
+ *	Yifeng Huang <huangyifeng@eswincomputing.com>
+ *	Xuyang Dong <dongxuyang@eswincomputing.com>
+ */
+
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+#include <linux/reset-controller.h>
+#include <linux/slab.h>
+#include <linux/types.h>
+
+#include <dt-bindings/reset/eswin,eic7700-reset.h>
+
+#define SYSCRG_CLEAR_BOOT_INFO_OFFSET 0x30C
+#define CLEAR_BOOT_FLAG_BIT BIT(0)
+#define SYSCRG_RESET_OFFSET 0x400
+
+/**
+ * struct eswin_reset_data - reset controller information structure
+ * @rcdev: reset controller entity
+ * @regmap: regmap handle containing the memory-mapped reset registers
+ */
+struct eswin_reset_data {
+	struct reset_controller_dev rcdev;
+	struct regmap *regmap;
+};
+
+static const struct regmap_config eswin_regmap_config = {
+	.reg_bits = 32,
+	.val_bits = 32,
+	.max_register = 0x8000000,
+};
+
+struct eic7700_reg {
+	u32 reg;
+	u32 bit;
+};
+
+#define to_eswin_reset_data(p) container_of((p), struct eswin_reset_data, rcdev)
+
+#define EIC7700_RESET_OFFSET(id, reg, bit)[id] = \
+		{ SYSCRG_RESET_OFFSET + (reg) * sizeof(u32), BIT(bit) }
+
+/* mapping table for reset ID to register offset */
+static const struct eic7700_reg eic7700_register_offset[] = {
+	EIC7700_RESET_OFFSET(EIC7700_RESET_NOC_NSP, 0, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_NOC_CFG, 0, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_RNOC_NSP, 0, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_TCU, 0, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_U84, 0, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_PCIE_XSR, 0, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_PCIE_XMR, 0, 6),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_PCIE_PR, 0, 7),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_NPU, 0, 8),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_JTAG, 0, 9),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_DSP, 0, 10),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_DDRC1_P2, 0, 11),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_DDRC1_P1, 0, 12),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_DDRC0_P2, 0, 13),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_DDRC0_P1, 0, 14),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_D2D, 0, 15),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_AON, 0, 16),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_GPU_AXI, 1, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_GPU_CFG, 1, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_GPU_GRAY, 1, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_GPU_JONES, 1, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_GPU_SPU, 1, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DSP_AXI, 2, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DSP_CFG, 2, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DSP_DIV4, 2, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DSP_DIV0, 2, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DSP_DIV1, 2, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DSP_DIV2, 2, 6),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DSP_DIV3, 2, 7),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_D2D_AXI, 3, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_D2D_CFG, 3, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_D2D_PRST, 3, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_D2D_RAW_PCS, 3, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_D2D_RX, 3, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_D2D_TX, 3, 6),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_D2D_CORE, 3, 7),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DDR1_ARST, 4, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DDR1_TRACE, 4, 6),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DDR0_ARST, 4, 16),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DDR_CFG, 4, 21),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DDR0_TRACE, 4, 22),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DDR_CORE, 4, 23),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DDR_PRST, 4, 26),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_AXI, 5, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_CFG, 5, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU0, 5, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU1, 5, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU2, 5, 6),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU3, 5, 7),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU4, 5, 8),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU5, 5, 9),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU6, 5, 10),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU7, 5, 11),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU8, 5, 12),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU9, 5, 13),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU10, 5, 14),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU11, 5, 15),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU12, 5, 16),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU13, 5, 17),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU14, 5, 18),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU15, 5, 19),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU16, 5, 20),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_NPU_AXI, 6, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_NPU_CFG, 6, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_NPU_CORE, 6, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_NPU_E31CORE, 6, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_NPU_E31BUS, 6, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_NPU_E31DBG, 6, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_NPU_LLC, 6, 6),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_AXI, 7, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_CFG, 7, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_POR, 7, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MSHC0_PHY, 7, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MSHC1_PHY, 7, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MSHC2_PHY, 7, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MSHC0_TXRX, 7, 6),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MSHC1_TXRX, 7, 7),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MSHC2_TXRX, 7, 8),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SATA_ASIC0, 7, 9),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SATA_OOB, 7, 10),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SATA_PMALIVE, 7, 11),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SATA_RBC, 7, 12),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DMA0, 7, 13),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_DMA, 7, 14),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_USB0_VAUX, 7, 15),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_USB1_VAUX, 7, 16),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_SD1_PRST, 7, 17),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_SD0_PRST, 7, 18),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_EMMC_PRST, 7, 19),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_DMA_PRST, 7, 20),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_SD1_ARST, 7, 21),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_SD0_ARST, 7, 22),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_EMMC_ARST, 7, 23),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_DMA_ARST, 7, 24),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_ETH1_ARST, 7, 25),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_ETH0_ARST, 7, 26),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SATA_ARST, 7, 27),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_PCIE_CFG, 8, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_PCIE_POWEUP, 8, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_PCIE_PERST, 8, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C0, 9, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C1, 9, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C2, 9, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C3, 9, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C4, 9, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C5, 9, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C6, 9, 6),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C7, 9, 7),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C8, 9, 8),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C9, 9, 9),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_FAN, 10, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_PVT0, 11, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_PVT1, 11, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX0, 12, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX1, 12, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX2, 12, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX3, 12, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX4, 12, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX5, 12, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX6, 12, 6),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX7, 12, 7),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX8, 12, 8),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX9, 12, 9),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX10, 12, 10),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX11, 12, 11),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX12, 12, 12),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX13, 12, 13),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX14, 12, 14),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX15, 12, 15),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_UART0, 13, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_UART1, 13, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_UART2, 13, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_UART3, 13, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_UART4, 13, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_GPIO0, 14, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_GPIO1, 14, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER, 15, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SSI0, 16, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SSI1, 16, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_WDT0, 17, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_WDT1, 17, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_WDT2, 17, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_WDT3, 17, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_LSP_CFG, 18, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_CORE0, 19, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_CORE1, 19, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_CORE2, 19, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_CORE3, 19, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_BUS, 19, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_DBG, 19, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_TRACECOM, 19, 6),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_TRACE0, 19, 8),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_TRACE1, 19, 9),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_TRACE2, 19, 10),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_TRACE3, 19, 11),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SCPU_CORE, 20, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SCPU_BUS, 20, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SCPU_DBG, 20, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_LPCPU_CORE, 21, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_LPCPU_BUS, 21, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_LPCPU_DBG, 21, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VC_CFG, 22, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VC_AXI, 22, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VC_MONCFG, 22, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_JD_CFG, 23, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_JD_AXI, 23, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_JE_CFG, 24, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_JE_AXI, 24, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VD_CFG, 25, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VD_AXI, 25, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VE_AXI, 26, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VE_CFG, 26, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_G2D_CORE, 27, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_G2D_CFG, 27, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_G2D_AXI, 27, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VI_AXI, 28, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VI_CFG, 28, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VI_DWE, 28, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DVP, 29, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_ISP0, 30, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_ISP1, 31, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SHUTTR0, 32, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SHUTTR1, 32, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SHUTTR2, 32, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SHUTTR3, 32, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SHUTTR4, 32, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SHUTTR5, 32, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_MIPI, 33, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_PRST, 33, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_HDMI_PRST, 33, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_HDMI_PHY, 33, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_HDMI, 33, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_I2S, 34, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_I2S_PRST, 34, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_AXI, 35, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_CFG, 35, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_DC, 35, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_DC_PRST, 35, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_BOOTSPI_HRST, 36, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_BOOTSPI, 36, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_ANO1, 37, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_ANO0, 38, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DMA1_ARST, 39, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_DMA1_HRST, 39, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_FPRT, 40, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_HBLOCK, 41, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SECSR, 42, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_OTP, 43, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_PKA, 44, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_SPACC, 45, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TRNG, 46, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_0, 48, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_1, 48, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_2, 48, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_3, 48, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_4, 48, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_5, 48, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_6, 48, 6),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_7, 48, 7),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_N, 48, 8),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_0, 49, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_1, 49, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_2, 49, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_3, 49, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_4, 49, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_5, 49, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_6, 49, 6),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_7, 49, 7),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_N, 49, 8),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_0, 50, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_1, 50, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_2, 50, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_3, 50, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_4, 50, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_5, 50, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_6, 50, 6),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_7, 50, 7),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_N, 50, 8),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_0, 51, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_1, 51, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_2, 51, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_3, 51, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_4, 51, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_5, 51, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_6, 51, 6),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_7, 51, 7),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_N, 51, 8),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_RTC, 52, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_SNOC_NSP, 53, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_VC, 53, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_CFG, 53, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_HSP, 53, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_GPU, 53, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_DDRC1_P3, 53, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_DDRC0_P3, 53, 6),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_RNOC_VO, 54, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_RNOC_VI, 54, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_RNOC_SNOC_NSP, 54, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_RNOC_CFG, 54, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_DDRC1_P4, 54, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_DDRC0_P4, 54, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_VO_CFG, 55, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_VI_CFG, 55, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_VC_CFG, 55, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_TCU_CFG, 55, 3),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_PCIE_CFG, 55, 4),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_NPU_CFG, 55, 5),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_LSP_CFG, 55, 6),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_HSP_CFG, 55, 7),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_GPU_CFG, 55, 8),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_DSPT_CFG, 55, 9),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_DDRT1_CFG, 55, 10),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_DDRT0_CFG, 55, 11),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_D2D_CFG, 55, 12),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_CFG, 55, 13),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_CLMM_CFG, 55, 14),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_AON_CFG, 55, 15),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_LNOC_CFG, 56, 0),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_LNOC_NPU_LLC, 56, 1),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_LNOC_DDRC1_P0, 56, 2),
+	EIC7700_RESET_OFFSET(EIC7700_RESET_LNOC_DDRC0_P0, 56, 3),
+};
+
+/**
+ * eswin_reset_set() - program a device's reset
+ * @rcdev: reset controller entity
+ * @id: ID of the reset to toggle
+ * @assert: boolean flag to indicate assert or deassert
+ *
+ * This is a common internal function used to assert or deassert a device's
+ * reset by clear and set the reset bit. The device's reset is asserted if the
+ * @assert argument is true, or deasserted if @assert argument is false.
+ *
+ * Return: 0 for successful request, else a corresponding error value
+ */
+static int eswin_reset_set(struct reset_controller_dev *rcdev, unsigned long id,
+			   bool assert)
+{
+	struct eswin_reset_data *data = to_eswin_reset_data(rcdev);
+	int ret;
+
+	if (assert)
+		ret = regmap_clear_bits(data->regmap,
+					eic7700_register_offset[id].reg,
+					eic7700_register_offset[id].bit);
+	else
+		ret = regmap_set_bits(data->regmap,
+				      eic7700_register_offset[id].reg,
+				      eic7700_register_offset[id].bit);
+
+	return ret;
+}
+
+static int eswin_reset_assert(struct reset_controller_dev *rcdev,
+			      unsigned long id)
+{
+	return eswin_reset_set(rcdev, id, true);
+}
+
+static int eswin_reset_deassert(struct reset_controller_dev *rcdev,
+				unsigned long id)
+{
+	return eswin_reset_set(rcdev, id, false);
+}
+
+static int eswin_reset_reset(struct reset_controller_dev *rcdev,
+			     unsigned long id)
+{
+	int ret;
+
+	ret = eswin_reset_assert(rcdev, id);
+	if (ret)
+		return ret;
+
+	return eswin_reset_deassert(rcdev, id);
+}
+
+static const struct reset_control_ops eswin_reset_ops = {
+	.reset = eswin_reset_reset,
+	.assert = eswin_reset_assert,
+	.deassert = eswin_reset_deassert,
+};
+
+static const struct of_device_id eswin_reset_dt_ids[] = {
+	{
+		.compatible = "eswin,eic7700-reset",
+	},
+	{ /* sentinel */ }
+};
+
+static int eswin_reset_probe(struct platform_device *pdev)
+{
+	struct eswin_reset_data *data;
+	struct device *dev = &pdev->dev;
+	void __iomem *base;
+
+	data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
+	if (!data)
+		return -ENOMEM;
+
+	base = devm_platform_ioremap_resource(pdev, 0);
+	if (IS_ERR(base))
+		return PTR_ERR(base);
+
+	data->regmap = devm_regmap_init_mmio(dev, base, &eswin_regmap_config);
+	if (IS_ERR(data->regmap))
+		return dev_err_probe(dev, PTR_ERR(data->regmap),
+				     "failed to get regmap!\n");
+
+	platform_set_drvdata(pdev, data);
+
+	data->rcdev.owner = THIS_MODULE;
+	data->rcdev.ops = &eswin_reset_ops;
+	data->rcdev.of_node = pdev->dev.of_node;
+	data->rcdev.of_reset_n_cells = 1;
+	data->rcdev.dev = &pdev->dev;
+	data->rcdev.nr_resets = EIC7700_RESET_MAX;
+
+	/* clear boot flag so u84 and scpu could be reseted by software */
+	regmap_set_bits(data->regmap, SYSCRG_CLEAR_BOOT_INFO_OFFSET,
+			CLEAR_BOOT_FLAG_BIT);
+	msleep(50);
+
+	return devm_reset_controller_register(&pdev->dev, &data->rcdev);
+}
+
+static struct platform_driver eswin_reset_driver = {
+	.probe	= eswin_reset_probe,
+	.driver = {
+		.name		= "eswin-reset",
+		.of_match_table	= eswin_reset_dt_ids,
+	},
+};
+
+static int __init eswin_reset_init(void)
+{
+	return platform_driver_register(&eswin_reset_driver);
+}
+arch_initcall(eswin_reset_init);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v4 2/2] reset: eswin: Add eic7700 reset driver
  2025-07-15 12:15 ` [PATCH v4 2/2] reset: eswin: Add eic7700 reset driver dongxuyang
@ 2025-07-15 13:37   ` Philipp Zabel
  0 siblings, 0 replies; 6+ messages in thread
From: Philipp Zabel @ 2025-07-15 13:37 UTC (permalink / raw)
  To: dongxuyang, robh, krzk+dt, conor+dt, devicetree, linux-kernel
  Cc: ningyu, linmin, huangyifeng, pinkesh.vaghela

On Di, 2025-07-15 at 20:15 +0800, dongxuyang@eswincomputing.com wrote:
> From: Xuyang Dong <dongxuyang@eswincomputing.com>
> 
> Add support for reset controller in eic7700 series chips.
> Provide functionality for asserting and deasserting resets
> on the chip.
> 
> Signed-off-by: Yifeng Huang <huangyifeng@eswincomputing.com>
> Signed-off-by: Xuyang Dong <dongxuyang@eswincomputing.com>
> ---
>  drivers/reset/Kconfig         |  10 +
>  drivers/reset/Makefile        |   1 +
>  drivers/reset/reset-eic7700.c | 454 ++++++++++++++++++++++++++++++++++
>  3 files changed, 465 insertions(+)
>  create mode 100644 drivers/reset/reset-eic7700.c
> 
> diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
> index d85be5899da6..82f829f4c9f0 100644
> --- a/drivers/reset/Kconfig
> +++ b/drivers/reset/Kconfig
> @@ -66,6 +66,16 @@ config RESET_BRCMSTB_RESCAL
>  	  This enables the RESCAL reset controller for SATA, PCIe0, or PCIe1 on
>  	  BCM7216.
>  
> +config RESET_EIC7700
> +	bool "Reset controller driver for ESWIN SoCs"
> +	depends on ARCH_ESWIN || COMPILE_TEST
> +	default ARCH_ESWIN
> +	help
> +	  This enables the reset controller driver for ESWIN SoCs. This driver is
> +	  specific to ESWIN SoCs and should only be enabled if using such hardware.
> +	  The driver supports eic7700 series chips and provides functionality for
> +	  asserting and deasserting resets on the chip.
> +
>  config RESET_EYEQ
>  	bool "Mobileye EyeQ reset controller"
>  	depends on MACH_EYEQ5 || MACH_EYEQ6H || COMPILE_TEST
> diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
> index 91e6348e3351..ceafbad0555c 100644
> --- a/drivers/reset/Makefile
> +++ b/drivers/reset/Makefile
> @@ -12,6 +12,7 @@ obj-$(CONFIG_RESET_BCM6345) += reset-bcm6345.o
>  obj-$(CONFIG_RESET_BERLIN) += reset-berlin.o
>  obj-$(CONFIG_RESET_BRCMSTB) += reset-brcmstb.o
>  obj-$(CONFIG_RESET_BRCMSTB_RESCAL) += reset-brcmstb-rescal.o
> +obj-$(CONFIG_RESET_EIC7700) += reset-eic7700.o
>  obj-$(CONFIG_RESET_EYEQ) += reset-eyeq.o
>  obj-$(CONFIG_RESET_GPIO) += reset-gpio.o
>  obj-$(CONFIG_RESET_HSDK) += reset-hsdk.o
> diff --git a/drivers/reset/reset-eic7700.c b/drivers/reset/reset-eic7700.c
> new file mode 100644
> index 000000000000..1acc531343b0
> --- /dev/null
> +++ b/drivers/reset/reset-eic7700.c
> @@ -0,0 +1,454 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright 2025, Beijing ESWIN Computing Technology Co., Ltd..
> + * All rights reserved.
> + *
> + * ESWIN Reset Driver
> + *
> + * Authors:
> + *	Yifeng Huang <huangyifeng@eswincomputing.com>
> + *	Xuyang Dong <dongxuyang@eswincomputing.com>
> + */
> +
> +#include <linux/err.h>
> +#include <linux/init.h>
> +#include <linux/of.h>
> +#include <linux/platform_device.h>
> +#include <linux/regmap.h>
> +#include <linux/reset-controller.h>
> +#include <linux/slab.h>
> +#include <linux/types.h>
> +
> +#include <dt-bindings/reset/eswin,eic7700-reset.h>
> +
> +#define SYSCRG_CLEAR_BOOT_INFO_OFFSET 0x30C
> +#define CLEAR_BOOT_FLAG_BIT BIT(0)
> +#define SYSCRG_RESET_OFFSET 0x400
> +
> +/**
> + * struct eswin_reset_data - reset controller information structure
> + * @rcdev: reset controller entity
> + * @regmap: regmap handle containing the memory-mapped reset registers
> + */
> +struct eswin_reset_data {
> +	struct reset_controller_dev rcdev;
> +	struct regmap *regmap;
> +};
> +
> +static const struct regmap_config eswin_regmap_config = {
> +	.reg_bits = 32,
> +	.val_bits = 32,
> +	.max_register = 0x8000000,

That doesn't look correct. According to the device tree example, the
register space is only 0x80000 bytes. This should be the address offset
of the last valid register, so I'd expect at most 0x7fffc.

> +};
> +
> +struct eic7700_reg {
> +	u32 reg;
> +	u32 bit;
> +};
> +
> +#define to_eswin_reset_data(p) container_of((p), struct eswin_reset_data, rcdev)

Please make this an inline function.

> +
> +#define EIC7700_RESET_OFFSET(id, reg, bit)[id] = \
> +		{ SYSCRG_RESET_OFFSET + (reg) * sizeof(u32), BIT(bit) }

I suggest calling this macro EIC7700_RESET().
It's shorter and the "bit" field is not an offset.

> +
> +/* mapping table for reset ID to register offset */
> +static const struct eic7700_reg eic7700_register_offset[] = {

You could make this eic7700_register_offset[EIC7700_RESET_MAX].

Same as above, there might be a better name than _register_offset.
How about eic7700_resets[]?

> +	EIC7700_RESET_OFFSET(EIC7700_RESET_NOC_NSP, 0, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_NOC_CFG, 0, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_RNOC_NSP, 0, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_TCU, 0, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_U84, 0, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_PCIE_XSR, 0, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_PCIE_XMR, 0, 6),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_PCIE_PR, 0, 7),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_NPU, 0, 8),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_JTAG, 0, 9),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_DSP, 0, 10),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_DDRC1_P2, 0, 11),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_DDRC1_P1, 0, 12),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_DDRC0_P2, 0, 13),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_DDRC0_P1, 0, 14),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_D2D, 0, 15),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SNOC_AON, 0, 16),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_GPU_AXI, 1, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_GPU_CFG, 1, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_GPU_GRAY, 1, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_GPU_JONES, 1, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_GPU_SPU, 1, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DSP_AXI, 2, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DSP_CFG, 2, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DSP_DIV4, 2, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DSP_DIV0, 2, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DSP_DIV1, 2, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DSP_DIV2, 2, 6),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DSP_DIV3, 2, 7),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_D2D_AXI, 3, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_D2D_CFG, 3, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_D2D_PRST, 3, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_D2D_RAW_PCS, 3, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_D2D_RX, 3, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_D2D_TX, 3, 6),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_D2D_CORE, 3, 7),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DDR1_ARST, 4, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DDR1_TRACE, 4, 6),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DDR0_ARST, 4, 16),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DDR_CFG, 4, 21),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DDR0_TRACE, 4, 22),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DDR_CORE, 4, 23),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DDR_PRST, 4, 26),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_AXI, 5, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_CFG, 5, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU0, 5, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU1, 5, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU2, 5, 6),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU3, 5, 7),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU4, 5, 8),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU5, 5, 9),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU6, 5, 10),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU7, 5, 11),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU8, 5, 12),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU9, 5, 13),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU10, 5, 14),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU11, 5, 15),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU12, 5, 16),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU13, 5, 17),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU14, 5, 18),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU15, 5, 19),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TCU_TBU16, 5, 20),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_NPU_AXI, 6, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_NPU_CFG, 6, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_NPU_CORE, 6, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_NPU_E31CORE, 6, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_NPU_E31BUS, 6, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_NPU_E31DBG, 6, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_NPU_LLC, 6, 6),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_AXI, 7, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_CFG, 7, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_POR, 7, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MSHC0_PHY, 7, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MSHC1_PHY, 7, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MSHC2_PHY, 7, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MSHC0_TXRX, 7, 6),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MSHC1_TXRX, 7, 7),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MSHC2_TXRX, 7, 8),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SATA_ASIC0, 7, 9),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SATA_OOB, 7, 10),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SATA_PMALIVE, 7, 11),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SATA_RBC, 7, 12),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DMA0, 7, 13),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_DMA, 7, 14),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_USB0_VAUX, 7, 15),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_USB1_VAUX, 7, 16),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_SD1_PRST, 7, 17),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_SD0_PRST, 7, 18),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_EMMC_PRST, 7, 19),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_DMA_PRST, 7, 20),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_SD1_ARST, 7, 21),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_SD0_ARST, 7, 22),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_EMMC_ARST, 7, 23),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_DMA_ARST, 7, 24),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_ETH1_ARST, 7, 25),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_HSP_ETH0_ARST, 7, 26),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SATA_ARST, 7, 27),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_PCIE_CFG, 8, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_PCIE_POWEUP, 8, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_PCIE_PERST, 8, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C0, 9, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C1, 9, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C2, 9, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C3, 9, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C4, 9, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C5, 9, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C6, 9, 6),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C7, 9, 7),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C8, 9, 8),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_I2C9, 9, 9),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_FAN, 10, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_PVT0, 11, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_PVT1, 11, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX0, 12, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX1, 12, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX2, 12, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX3, 12, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX4, 12, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX5, 12, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX6, 12, 6),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX7, 12, 7),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX8, 12, 8),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX9, 12, 9),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX10, 12, 10),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX11, 12, 11),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX12, 12, 12),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX13, 12, 13),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX14, 12, 14),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MBOX15, 12, 15),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_UART0, 13, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_UART1, 13, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_UART2, 13, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_UART3, 13, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_UART4, 13, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_GPIO0, 14, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_GPIO1, 14, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER, 15, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SSI0, 16, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SSI1, 16, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_WDT0, 17, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_WDT1, 17, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_WDT2, 17, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_WDT3, 17, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_LSP_CFG, 18, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_CORE0, 19, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_CORE1, 19, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_CORE2, 19, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_CORE3, 19, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_BUS, 19, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_DBG, 19, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_TRACECOM, 19, 6),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_TRACE0, 19, 8),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_TRACE1, 19, 9),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_TRACE2, 19, 10),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_U84_TRACE3, 19, 11),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SCPU_CORE, 20, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SCPU_BUS, 20, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SCPU_DBG, 20, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_LPCPU_CORE, 21, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_LPCPU_BUS, 21, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_LPCPU_DBG, 21, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VC_CFG, 22, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VC_AXI, 22, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VC_MONCFG, 22, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_JD_CFG, 23, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_JD_AXI, 23, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_JE_CFG, 24, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_JE_AXI, 24, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VD_CFG, 25, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VD_AXI, 25, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VE_AXI, 26, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VE_CFG, 26, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_G2D_CORE, 27, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_G2D_CFG, 27, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_G2D_AXI, 27, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VI_AXI, 28, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VI_CFG, 28, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VI_DWE, 28, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DVP, 29, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_ISP0, 30, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_ISP1, 31, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SHUTTR0, 32, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SHUTTR1, 32, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SHUTTR2, 32, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SHUTTR3, 32, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SHUTTR4, 32, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SHUTTR5, 32, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_MIPI, 33, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_PRST, 33, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_HDMI_PRST, 33, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_HDMI_PHY, 33, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_HDMI, 33, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_I2S, 34, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_I2S_PRST, 34, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_AXI, 35, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_CFG, 35, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_DC, 35, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_VO_DC_PRST, 35, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_BOOTSPI_HRST, 36, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_BOOTSPI, 36, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_ANO1, 37, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_ANO0, 38, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DMA1_ARST, 39, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_DMA1_HRST, 39, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_FPRT, 40, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_HBLOCK, 41, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SECSR, 42, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_OTP, 43, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_PKA, 44, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_SPACC, 45, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TRNG, 46, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_0, 48, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_1, 48, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_2, 48, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_3, 48, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_4, 48, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_5, 48, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_6, 48, 6),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_7, 48, 7),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER0_N, 48, 8),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_0, 49, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_1, 49, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_2, 49, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_3, 49, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_4, 49, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_5, 49, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_6, 49, 6),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_7, 49, 7),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER1_N, 49, 8),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_0, 50, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_1, 50, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_2, 50, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_3, 50, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_4, 50, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_5, 50, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_6, 50, 6),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_7, 50, 7),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER2_N, 50, 8),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_0, 51, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_1, 51, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_2, 51, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_3, 51, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_4, 51, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_5, 51, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_6, 51, 6),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_7, 51, 7),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_TIMER3_N, 51, 8),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_RTC, 52, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_SNOC_NSP, 53, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_VC, 53, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_CFG, 53, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_HSP, 53, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_GPU, 53, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_DDRC1_P3, 53, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_DDRC0_P3, 53, 6),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_RNOC_VO, 54, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_RNOC_VI, 54, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_RNOC_SNOC_NSP, 54, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_RNOC_CFG, 54, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_DDRC1_P4, 54, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_MNOC_DDRC0_P4, 54, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_VO_CFG, 55, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_VI_CFG, 55, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_VC_CFG, 55, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_TCU_CFG, 55, 3),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_PCIE_CFG, 55, 4),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_NPU_CFG, 55, 5),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_LSP_CFG, 55, 6),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_HSP_CFG, 55, 7),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_GPU_CFG, 55, 8),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_DSPT_CFG, 55, 9),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_DDRT1_CFG, 55, 10),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_DDRT0_CFG, 55, 11),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_D2D_CFG, 55, 12),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_CFG, 55, 13),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_CLMM_CFG, 55, 14),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_CNOC_AON_CFG, 55, 15),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_LNOC_CFG, 56, 0),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_LNOC_NPU_LLC, 56, 1),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_LNOC_DDRC1_P0, 56, 2),
> +	EIC7700_RESET_OFFSET(EIC7700_RESET_LNOC_DDRC0_P0, 56, 3),
> +};
> +
> +/**
> + * eswin_reset_set() - program a device's reset
> + * @rcdev: reset controller entity
> + * @id: ID of the reset to toggle
> + * @assert: boolean flag to indicate assert or deassert
> + *
> + * This is a common internal function used to assert or deassert a device's
> + * reset by clear and set the reset bit. The device's reset is asserted if the
> + * @assert argument is true, or deasserted if @assert argument is false.
> + *
> + * Return: 0 for successful request, else a corresponding error value
> + */
> +static int eswin_reset_set(struct reset_controller_dev *rcdev, unsigned long id,
> +			   bool assert)
> +{
> +	struct eswin_reset_data *data = to_eswin_reset_data(rcdev);
> +	int ret;
> +
> +	if (assert)
> +		ret = regmap_clear_bits(data->regmap,
> +					eic7700_register_offset[id].reg,
> +					eic7700_register_offset[id].bit);
> +	else
> +		ret = regmap_set_bits(data->regmap,
> +				      eic7700_register_offset[id].reg,
> +				      eic7700_register_offset[id].bit);
> +
> +	return ret;
> +}

Please just fold this into the eswin_reset_assert/deassert() functions.
There is no need to have a common helper function where the only common
line of code is the data variable assignment.

> +
> +static int eswin_reset_assert(struct reset_controller_dev *rcdev,
> +			      unsigned long id)
> +{
> +	return eswin_reset_set(rcdev, id, true);
> +}
> +
> +static int eswin_reset_deassert(struct reset_controller_dev *rcdev,
> +				unsigned long id)
> +{
> +	return eswin_reset_set(rcdev, id, false);
> +}
> +
> +static int eswin_reset_reset(struct reset_controller_dev *rcdev,
> +			     unsigned long id)
> +{
> +	int ret;
> +
> +	ret = eswin_reset_assert(rcdev, id);
> +	if (ret)
> +		return ret;

Does this work without delay for every IP core contained in this SoC?

> +	return eswin_reset_deassert(rcdev, id);
> +}
> +
> +static const struct reset_control_ops eswin_reset_ops = {
> +	.reset = eswin_reset_reset,
> +	.assert = eswin_reset_assert,
> +	.deassert = eswin_reset_deassert,
> +};
> +
> +static const struct of_device_id eswin_reset_dt_ids[] = {
> +	{
> +		.compatible = "eswin,eic7700-reset",
> +	},
> +	{ /* sentinel */ }
> +};
> +
> +static int eswin_reset_probe(struct platform_device *pdev)
> +{
> +	struct eswin_reset_data *data;
> +	struct device *dev = &pdev->dev;
> +	void __iomem *base;
> +
> +	data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
> +	if (!data)
> +		return -ENOMEM;
> +
> +	base = devm_platform_ioremap_resource(pdev, 0);
> +	if (IS_ERR(base))
> +		return PTR_ERR(base);
> +
> +	data->regmap = devm_regmap_init_mmio(dev, base, &eswin_regmap_config);
> +	if (IS_ERR(data->regmap))
> +		return dev_err_probe(dev, PTR_ERR(data->regmap),
> +				     "failed to get regmap!\n");
> +
> +	platform_set_drvdata(pdev, data);
> +
> +	data->rcdev.owner = THIS_MODULE;
> +	data->rcdev.ops = &eswin_reset_ops;
> +	data->rcdev.of_node = pdev->dev.of_node;
> +	data->rcdev.of_reset_n_cells = 1;
> +	data->rcdev.dev = &pdev->dev;
> +	data->rcdev.nr_resets = EIC7700_RESET_MAX;

Better use ARRAY_SIZE(eic7700_register_offset).

> +
> +	/* clear boot flag so u84 and scpu could be reseted by software */
> +	regmap_set_bits(data->regmap, SYSCRG_CLEAR_BOOT_INFO_OFFSET,
> +			CLEAR_BOOT_FLAG_BIT);
> +	msleep(50);
> +
> +	return devm_reset_controller_register(&pdev->dev, &data->rcdev);
> +}
> +
> +static struct platform_driver eswin_reset_driver = {
> +	.probe	= eswin_reset_probe,
> +	.driver = {
> +		.name		= "eswin-reset",
> +		.of_match_table	= eswin_reset_dt_ids,
> +	},
> +};
> +
> +static int __init eswin_reset_init(void)
> +{
> +	return platform_driver_register(&eswin_reset_driver);
> +}
> +arch_initcall(eswin_reset_init);

Why does this have to be arch_initcall()?

regards
Philipp

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v4 0/2] Add driver support for ESWIN eic7700 SoC reset controller
  2025-07-15 12:14 [PATCH v4 0/2] Add driver support for ESWIN eic7700 SoC reset controller dongxuyang
  2025-07-15 12:15 ` [PATCH v4 1/2] dt-bindings: reset: eswin: Documentation for eic7700 SoC dongxuyang
  2025-07-15 12:15 ` [PATCH v4 2/2] reset: eswin: Add eic7700 reset driver dongxuyang
@ 2025-07-15 15:47 ` Krzysztof Kozlowski
  2 siblings, 0 replies; 6+ messages in thread
From: Krzysztof Kozlowski @ 2025-07-15 15:47 UTC (permalink / raw)
  To: dongxuyang, p.zabel, robh, krzk+dt, conor+dt, devicetree,
	linux-kernel
  Cc: ningyu, linmin, huangyifeng, pinkesh.vaghela

On 15/07/2025 14:14, dongxuyang@eswincomputing.com wrote:
> From: Xuyang Dong <dongxuyang@eswincomputing.com>
> 
> Updates:
> 
>   dt-bindings: reset: eswin: Documentation for eic7700 SoC
>   v3 -> v4:
>     1. Remove register offsets in dt-bindings.
>     2. Changed the const value of "#reset-cells" from 2 to 1.
>        Because the offsets were removed from dt-bindings. There are
>        only IDs. And removed the description of it.
>     3. Modify copyright year from 2024 to 2025.
>     4. Redefined the IDs in the dt-bindings and used these to build a
>        reset array in reset driver. Ensure that the reset register and
>        reset value corresponding to the IDs are correct.
>     Link to v3: https://lore.kernel.org/all/20250624103212.287-1-dongxuyang@eswincomputing.com/

This leads to clock patchset, not reset.

Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v4 1/2] dt-bindings: reset: eswin: Documentation for eic7700 SoC
  2025-07-15 12:15 ` [PATCH v4 1/2] dt-bindings: reset: eswin: Documentation for eic7700 SoC dongxuyang
@ 2025-07-15 15:49   ` Krzysztof Kozlowski
  0 siblings, 0 replies; 6+ messages in thread
From: Krzysztof Kozlowski @ 2025-07-15 15:49 UTC (permalink / raw)
  To: dongxuyang, p.zabel, robh, krzk+dt, conor+dt, devicetree,
	linux-kernel
  Cc: ningyu, linmin, huangyifeng, pinkesh.vaghela

On 15/07/2025 14:15, dongxuyang@eswincomputing.com wrote:
> +#define EIC7700_RESET_LNOC_NPU_LLC		278
> +#define EIC7700_RESET_LNOC_DDRC1_P0		279
> +#define EIC7700_RESET_LNOC_DDRC0_P0		280
> +#define EIC7700_RESET_MAX				281

Drop, not binding usually.

> +
> +#endif /* __DT_ESWIN_EIC7700_RESET_H__ */

With above change:

Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>

---

<form letter>
This is an automated instruction, just in case, because many review tags
are being ignored. If you know the process, you can skip it (please do
not feel offended by me posting it here - no bad intentions intended).
If you do not know the process, here is a short explanation:

Please add Acked-by/Reviewed-by/Tested-by tags when posting new versions
of patchset, under or above your Signed-off-by tag, unless patch changed
significantly (e.g. new properties added to the DT bindings). Tag is
"received", when provided in a message replied to you on the mailing
list. Tools like b4 can help here. However, there's no need to repost
patches *only* to add the tags. The upstream maintainer will do that for
tags received on the version they apply.

Full context and explanation:
https://elixir.bootlin.com/linux/v6.12-rc3/source/Documentation/process/submitting-patches.rst#L577
</form letter>


Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2025-07-15 15:49 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-15 12:14 [PATCH v4 0/2] Add driver support for ESWIN eic7700 SoC reset controller dongxuyang
2025-07-15 12:15 ` [PATCH v4 1/2] dt-bindings: reset: eswin: Documentation for eic7700 SoC dongxuyang
2025-07-15 15:49   ` Krzysztof Kozlowski
2025-07-15 12:15 ` [PATCH v4 2/2] reset: eswin: Add eic7700 reset driver dongxuyang
2025-07-15 13:37   ` Philipp Zabel
2025-07-15 15:47 ` [PATCH v4 0/2] Add driver support for ESWIN eic7700 SoC reset controller Krzysztof Kozlowski

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).