1*7cd3ca90SGary Yang // SPDX-License-Identifier: GPL-2.0-only 2*7cd3ca90SGary Yang /* 3*7cd3ca90SGary Yang * 4*7cd3ca90SGary Yang * CIX System Reset Controller (SRC) driver 5*7cd3ca90SGary Yang * 6*7cd3ca90SGary Yang * Author: Jerry Zhu <jerry.zhu@cixtech.com> 7*7cd3ca90SGary Yang */ 8*7cd3ca90SGary Yang 9*7cd3ca90SGary Yang #include <linux/delay.h> 10*7cd3ca90SGary Yang #include <linux/mfd/syscon.h> 11*7cd3ca90SGary Yang #include <linux/module.h> 12*7cd3ca90SGary Yang #include <linux/of.h> 13*7cd3ca90SGary Yang #include <linux/platform_device.h> 14*7cd3ca90SGary Yang #include <linux/regmap.h> 15*7cd3ca90SGary Yang #include <linux/reset-controller.h> 16*7cd3ca90SGary Yang 17*7cd3ca90SGary Yang #include <dt-bindings/reset/cix,sky1-system-control.h> 18*7cd3ca90SGary Yang #include <dt-bindings/reset/cix,sky1-s5-system-control.h> 19*7cd3ca90SGary Yang 20*7cd3ca90SGary Yang #define SKY1_RESET_SLEEP_MIN_US 50 21*7cd3ca90SGary Yang #define SKY1_RESET_SLEEP_MAX_US 100 22*7cd3ca90SGary Yang 23*7cd3ca90SGary Yang struct sky1_src_signal { 24*7cd3ca90SGary Yang unsigned int offset; 25*7cd3ca90SGary Yang unsigned int bit; 26*7cd3ca90SGary Yang }; 27*7cd3ca90SGary Yang 28*7cd3ca90SGary Yang struct sky1_src_variant { 29*7cd3ca90SGary Yang const struct sky1_src_signal *signals; 30*7cd3ca90SGary Yang unsigned int signals_num; 31*7cd3ca90SGary Yang }; 32*7cd3ca90SGary Yang 33*7cd3ca90SGary Yang struct sky1_src { 34*7cd3ca90SGary Yang struct reset_controller_dev rcdev; 35*7cd3ca90SGary Yang const struct sky1_src_signal *signals; 36*7cd3ca90SGary Yang struct regmap *regmap; 37*7cd3ca90SGary Yang }; 38*7cd3ca90SGary Yang 39*7cd3ca90SGary Yang enum { 40*7cd3ca90SGary Yang CSU_PM_RESET = 0x304, 41*7cd3ca90SGary Yang SENSORFUSION_RESET = 0x308, 42*7cd3ca90SGary Yang SENSORFUSION_NOC_RESET = 0x30c, 43*7cd3ca90SGary Yang RESET_GROUP0_S0_DOMAIN_0 = 0x400, 44*7cd3ca90SGary Yang RESET_GROUP0_S0_DOMAIN_1 = 0x404, 45*7cd3ca90SGary Yang RESET_GROUP1_USB_PHYS = 0x408, 46*7cd3ca90SGary Yang RESET_GROUP1_USB_CONTROLLERS = 0x40c, 47*7cd3ca90SGary Yang RESET_GROUP0_RCSU = 0x800, 48*7cd3ca90SGary Yang RESET_GROUP1_RCSU = 0x804, 49*7cd3ca90SGary Yang }; 50*7cd3ca90SGary Yang 51*7cd3ca90SGary Yang static const struct sky1_src_signal sky1_src_signals[] = { 52*7cd3ca90SGary Yang /* reset group1 for s0 domain modules */ 53*7cd3ca90SGary Yang [SKY1_CSU_PM_RESET_N] = { CSU_PM_RESET, BIT(0) }, 54*7cd3ca90SGary Yang [SKY1_SENSORFUSION_RESET_N] = { SENSORFUSION_RESET, BIT(0) }, 55*7cd3ca90SGary Yang [SKY1_SENSORFUSION_NOC_RESET_N] = { SENSORFUSION_NOC_RESET, BIT(0) }, 56*7cd3ca90SGary Yang [SKY1_DDRC_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(0) }, 57*7cd3ca90SGary Yang [SKY1_GIC_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(1) }, 58*7cd3ca90SGary Yang [SKY1_CI700_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(2) }, 59*7cd3ca90SGary Yang [SKY1_SYS_NI700_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(3) }, 60*7cd3ca90SGary Yang [SKY1_MM_NI700_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(4) }, 61*7cd3ca90SGary Yang [SKY1_PCIE_NI700_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(5) }, 62*7cd3ca90SGary Yang [SKY1_GPU_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(6) }, 63*7cd3ca90SGary Yang [SKY1_NPUTOP_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(7) }, 64*7cd3ca90SGary Yang [SKY1_NPUCORE0_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(8) }, 65*7cd3ca90SGary Yang [SKY1_NPUCORE1_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(9) }, 66*7cd3ca90SGary Yang [SKY1_NPUCORE2_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(10) }, 67*7cd3ca90SGary Yang [SKY1_VPU_RESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(11) }, 68*7cd3ca90SGary Yang [SKY1_ISP_SRESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(12) }, 69*7cd3ca90SGary Yang [SKY1_ISP_ARESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(13) }, 70*7cd3ca90SGary Yang [SKY1_ISP_HRESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(14) }, 71*7cd3ca90SGary Yang [SKY1_ISP_GDCRESET_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(15) }, 72*7cd3ca90SGary Yang [SKY1_DPU_RESET0_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(16) }, 73*7cd3ca90SGary Yang [SKY1_DPU_RESET1_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(17) }, 74*7cd3ca90SGary Yang [SKY1_DPU_RESET2_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(18) }, 75*7cd3ca90SGary Yang [SKY1_DPU_RESET3_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(19) }, 76*7cd3ca90SGary Yang [SKY1_DPU_RESET4_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(20) }, 77*7cd3ca90SGary Yang [SKY1_DP_RESET0_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(21) }, 78*7cd3ca90SGary Yang [SKY1_DP_RESET1_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(22) }, 79*7cd3ca90SGary Yang [SKY1_DP_RESET2_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(23) }, 80*7cd3ca90SGary Yang [SKY1_DP_RESET3_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(24) }, 81*7cd3ca90SGary Yang [SKY1_DP_RESET4_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(25) }, 82*7cd3ca90SGary Yang [SKY1_DP_PHY_RST_N] = { RESET_GROUP0_S0_DOMAIN_0, BIT(26) }, 83*7cd3ca90SGary Yang 84*7cd3ca90SGary Yang /* reset group1 for s0 domain modules */ 85*7cd3ca90SGary Yang [SKY1_AUDIO_HIFI5_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(0) }, 86*7cd3ca90SGary Yang [SKY1_AUDIO_HIFI5_NOC_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(1) }, 87*7cd3ca90SGary Yang [SKY1_CSIDPHY_PRST0_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(2) }, 88*7cd3ca90SGary Yang [SKY1_CSIDPHY_CMNRST0_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(3) }, 89*7cd3ca90SGary Yang [SKY1_CSI0_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(4) }, 90*7cd3ca90SGary Yang [SKY1_CSIDPHY_PRST1_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(5) }, 91*7cd3ca90SGary Yang [SKY1_CSIDPHY_CMNRST1_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(6) }, 92*7cd3ca90SGary Yang [SKY1_CSI1_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(7) }, 93*7cd3ca90SGary Yang [SKY1_CSI2_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(8) }, 94*7cd3ca90SGary Yang [SKY1_CSI3_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(9) }, 95*7cd3ca90SGary Yang [SKY1_CSIBRDGE0_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(10) }, 96*7cd3ca90SGary Yang [SKY1_CSIBRDGE1_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(11) }, 97*7cd3ca90SGary Yang [SKY1_CSIBRDGE2_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(12) }, 98*7cd3ca90SGary Yang [SKY1_CSIBRDGE3_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(13) }, 99*7cd3ca90SGary Yang [SKY1_GMAC0_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(14) }, 100*7cd3ca90SGary Yang [SKY1_GMAC1_RST_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(15) }, 101*7cd3ca90SGary Yang [SKY1_PCIE0_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(16) }, 102*7cd3ca90SGary Yang [SKY1_PCIE1_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(17) }, 103*7cd3ca90SGary Yang [SKY1_PCIE2_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(18) }, 104*7cd3ca90SGary Yang [SKY1_PCIE3_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(19) }, 105*7cd3ca90SGary Yang [SKY1_PCIE4_RESET_N] = { RESET_GROUP0_S0_DOMAIN_1, BIT(20) }, 106*7cd3ca90SGary Yang 107*7cd3ca90SGary Yang /* reset group1 for usb phys */ 108*7cd3ca90SGary Yang [SKY1_USB_DP_PHY0_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(0) }, 109*7cd3ca90SGary Yang [SKY1_USB_DP_PHY1_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(1) }, 110*7cd3ca90SGary Yang [SKY1_USB_DP_PHY2_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(2) }, 111*7cd3ca90SGary Yang [SKY1_USB_DP_PHY3_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(3) }, 112*7cd3ca90SGary Yang [SKY1_USB_DP_PHY0_RST_N] = { RESET_GROUP1_USB_PHYS, BIT(4) }, 113*7cd3ca90SGary Yang [SKY1_USB_DP_PHY1_RST_N] = { RESET_GROUP1_USB_PHYS, BIT(5) }, 114*7cd3ca90SGary Yang [SKY1_USB_DP_PHY2_RST_N] = { RESET_GROUP1_USB_PHYS, BIT(6) }, 115*7cd3ca90SGary Yang [SKY1_USB_DP_PHY3_RST_N] = { RESET_GROUP1_USB_PHYS, BIT(7) }, 116*7cd3ca90SGary Yang [SKY1_USBPHY_SS_PST_N] = { RESET_GROUP1_USB_PHYS, BIT(8) }, 117*7cd3ca90SGary Yang [SKY1_USBPHY_SS_RST_N] = { RESET_GROUP1_USB_PHYS, BIT(9) }, 118*7cd3ca90SGary Yang [SKY1_USBPHY_HS0_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(10) }, 119*7cd3ca90SGary Yang [SKY1_USBPHY_HS1_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(11) }, 120*7cd3ca90SGary Yang [SKY1_USBPHY_HS2_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(12) }, 121*7cd3ca90SGary Yang [SKY1_USBPHY_HS3_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(13) }, 122*7cd3ca90SGary Yang [SKY1_USBPHY_HS4_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(14) }, 123*7cd3ca90SGary Yang [SKY1_USBPHY_HS5_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(15) }, 124*7cd3ca90SGary Yang [SKY1_USBPHY_HS6_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(16) }, 125*7cd3ca90SGary Yang [SKY1_USBPHY_HS7_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(17) }, 126*7cd3ca90SGary Yang [SKY1_USBPHY_HS8_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(18) }, 127*7cd3ca90SGary Yang [SKY1_USBPHY_HS9_PRST_N] = { RESET_GROUP1_USB_PHYS, BIT(19) }, 128*7cd3ca90SGary Yang 129*7cd3ca90SGary Yang /* reset group1 for usb controllers */ 130*7cd3ca90SGary Yang [SKY1_USBC_SS0_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(0) }, 131*7cd3ca90SGary Yang [SKY1_USBC_SS1_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(1) }, 132*7cd3ca90SGary Yang [SKY1_USBC_SS2_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(2) }, 133*7cd3ca90SGary Yang [SKY1_USBC_SS3_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(3) }, 134*7cd3ca90SGary Yang [SKY1_USBC_SS4_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(4) }, 135*7cd3ca90SGary Yang [SKY1_USBC_SS5_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(5) }, 136*7cd3ca90SGary Yang [SKY1_USBC_SS0_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(6) }, 137*7cd3ca90SGary Yang [SKY1_USBC_SS1_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(7) }, 138*7cd3ca90SGary Yang [SKY1_USBC_SS2_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(8) }, 139*7cd3ca90SGary Yang [SKY1_USBC_SS3_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(9) }, 140*7cd3ca90SGary Yang [SKY1_USBC_SS4_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(10) }, 141*7cd3ca90SGary Yang [SKY1_USBC_SS5_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(11) }, 142*7cd3ca90SGary Yang [SKY1_USBC_HS0_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(12) }, 143*7cd3ca90SGary Yang [SKY1_USBC_HS1_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(13) }, 144*7cd3ca90SGary Yang [SKY1_USBC_HS2_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(14) }, 145*7cd3ca90SGary Yang [SKY1_USBC_HS3_PRST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(15) }, 146*7cd3ca90SGary Yang [SKY1_USBC_HS0_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(16) }, 147*7cd3ca90SGary Yang [SKY1_USBC_HS1_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(17) }, 148*7cd3ca90SGary Yang [SKY1_USBC_HS2_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(18) }, 149*7cd3ca90SGary Yang [SKY1_USBC_HS3_RST_N] = { RESET_GROUP1_USB_CONTROLLERS, BIT(19) }, 150*7cd3ca90SGary Yang 151*7cd3ca90SGary Yang /* reset group0 for rcsu */ 152*7cd3ca90SGary Yang [SKY1_AUDIO_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(0) }, 153*7cd3ca90SGary Yang [SKY1_CI700_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(1) }, 154*7cd3ca90SGary Yang [SKY1_CSI_RCSU0_RESET_N] = { RESET_GROUP0_RCSU, BIT(2) }, 155*7cd3ca90SGary Yang [SKY1_CSI_RCSU1_RESET_N] = { RESET_GROUP0_RCSU, BIT(3) }, 156*7cd3ca90SGary Yang [SKY1_CSU_PM_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(4) }, 157*7cd3ca90SGary Yang [SKY1_DDR_BROADCAST_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(5) }, 158*7cd3ca90SGary Yang [SKY1_DDR_CTRL_RCSU_0_RESET_N] = { RESET_GROUP0_RCSU, BIT(6) }, 159*7cd3ca90SGary Yang [SKY1_DDR_CTRL_RCSU_1_RESET_N] = { RESET_GROUP0_RCSU, BIT(7) }, 160*7cd3ca90SGary Yang [SKY1_DDR_CTRL_RCSU_2_RESET_N] = { RESET_GROUP0_RCSU, BIT(8) }, 161*7cd3ca90SGary Yang [SKY1_DDR_CTRL_RCSU_3_RESET_N] = { RESET_GROUP0_RCSU, BIT(9) }, 162*7cd3ca90SGary Yang [SKY1_DDR_TZC400_RCSU_0_RESET_N] = { RESET_GROUP0_RCSU, BIT(10) }, 163*7cd3ca90SGary Yang [SKY1_DDR_TZC400_RCSU_1_RESET_N] = { RESET_GROUP0_RCSU, BIT(11) }, 164*7cd3ca90SGary Yang [SKY1_DDR_TZC400_RCSU_2_RESET_N] = { RESET_GROUP0_RCSU, BIT(12) }, 165*7cd3ca90SGary Yang [SKY1_DDR_TZC400_RCSU_3_RESET_N] = { RESET_GROUP0_RCSU, BIT(13) }, 166*7cd3ca90SGary Yang [SKY1_DP0_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(14) }, 167*7cd3ca90SGary Yang [SKY1_DP1_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(15) }, 168*7cd3ca90SGary Yang [SKY1_DP2_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(16) }, 169*7cd3ca90SGary Yang [SKY1_DP3_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(17) }, 170*7cd3ca90SGary Yang [SKY1_DP4_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(18) }, 171*7cd3ca90SGary Yang [SKY1_DPU0_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(19) }, 172*7cd3ca90SGary Yang [SKY1_DPU1_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(20) }, 173*7cd3ca90SGary Yang [SKY1_DPU2_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(21) }, 174*7cd3ca90SGary Yang [SKY1_DPU3_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(22) }, 175*7cd3ca90SGary Yang [SKY1_DPU4_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(23) }, 176*7cd3ca90SGary Yang [SKY1_DSU_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(24) }, 177*7cd3ca90SGary Yang [SKY1_FCH_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(25) }, 178*7cd3ca90SGary Yang [SKY1_GICD_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(26) }, 179*7cd3ca90SGary Yang [SKY1_GMAC_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(27) }, 180*7cd3ca90SGary Yang [SKY1_GPU_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(28) }, 181*7cd3ca90SGary Yang [SKY1_ISP_RCSU0_RESET_N] = { RESET_GROUP0_RCSU, BIT(29) }, 182*7cd3ca90SGary Yang [SKY1_ISP_RCSU1_RESET_N] = { RESET_GROUP0_RCSU, BIT(30) }, 183*7cd3ca90SGary Yang [SKY1_NI700_MMHUB_RCSU_RESET_N] = { RESET_GROUP0_RCSU, BIT(31) }, 184*7cd3ca90SGary Yang 185*7cd3ca90SGary Yang /* reset group1 for rcsu */ 186*7cd3ca90SGary Yang [SKY1_NPU_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(0) }, 187*7cd3ca90SGary Yang [SKY1_NI700_PCIE_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(1) }, 188*7cd3ca90SGary Yang [SKY1_PCIE_X421_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(2) }, 189*7cd3ca90SGary Yang [SKY1_PCIE_X8_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(3) }, 190*7cd3ca90SGary Yang [SKY1_SF_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(4) }, 191*7cd3ca90SGary Yang [SKY1_RCSU_SMMU_MMHUB_RESET_N] = { RESET_GROUP1_RCSU, BIT(5) }, 192*7cd3ca90SGary Yang [SKY1_RCSU_SMMU_PCIEHUB_RESET_N] = { RESET_GROUP1_RCSU, BIT(6) }, 193*7cd3ca90SGary Yang [SKY1_RCSU_SYSHUB_RESET_N] = { RESET_GROUP1_RCSU, BIT(7) }, 194*7cd3ca90SGary Yang [SKY1_NI700_SMN_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(8) }, 195*7cd3ca90SGary Yang [SKY1_NI700_SYSHUB_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(9) }, 196*7cd3ca90SGary Yang [SKY1_RCSU_USB2_HOST0_RESET_N] = { RESET_GROUP1_RCSU, BIT(10) }, 197*7cd3ca90SGary Yang [SKY1_RCSU_USB2_HOST1_RESET_N] = { RESET_GROUP1_RCSU, BIT(11) }, 198*7cd3ca90SGary Yang [SKY1_RCSU_USB2_HOST2_RESET_N] = { RESET_GROUP1_RCSU, BIT(12) }, 199*7cd3ca90SGary Yang [SKY1_RCSU_USB2_HOST3_RESET_N] = { RESET_GROUP1_RCSU, BIT(13) }, 200*7cd3ca90SGary Yang [SKY1_RCSU_USB3_TYPEA_DRD_RESET_N] = { RESET_GROUP1_RCSU, BIT(14) }, 201*7cd3ca90SGary Yang [SKY1_RCSU_USB3_TYPEC_DRD_RESET_N] = { RESET_GROUP1_RCSU, BIT(15) }, 202*7cd3ca90SGary Yang [SKY1_RCSU_USB3_TYPEC_HOST0_RESET_N] = { RESET_GROUP1_RCSU, BIT(16) }, 203*7cd3ca90SGary Yang [SKY1_RCSU_USB3_TYPEC_HOST1_RESET_N] = { RESET_GROUP1_RCSU, BIT(17) }, 204*7cd3ca90SGary Yang [SKY1_RCSU_USB3_TYPEC_HOST2_RESET_N] = { RESET_GROUP1_RCSU, BIT(18) }, 205*7cd3ca90SGary Yang [SKY1_VPU_RCSU_RESET_N] = { RESET_GROUP1_RCSU, BIT(19) }, 206*7cd3ca90SGary Yang }; 207*7cd3ca90SGary Yang 208*7cd3ca90SGary Yang static const struct sky1_src_variant variant_sky1 = { 209*7cd3ca90SGary Yang .signals = sky1_src_signals, 210*7cd3ca90SGary Yang .signals_num = ARRAY_SIZE(sky1_src_signals), 211*7cd3ca90SGary Yang }; 212*7cd3ca90SGary Yang 213*7cd3ca90SGary Yang enum { 214*7cd3ca90SGary Yang FCH_SW_RST_FUNC = 0x8, 215*7cd3ca90SGary Yang FCH_SW_RST_BUS = 0xc, 216*7cd3ca90SGary Yang FCH_SW_XSPI = 0x10, 217*7cd3ca90SGary Yang }; 218*7cd3ca90SGary Yang 219*7cd3ca90SGary Yang static const struct sky1_src_signal sky1_src_fch_signals[] = { 220*7cd3ca90SGary Yang /* resets for fch_sw_rst_func */ 221*7cd3ca90SGary Yang [SW_I3C0_RST_FUNC_G_N] = { FCH_SW_RST_FUNC, BIT(0) }, 222*7cd3ca90SGary Yang [SW_I3C0_RST_FUNC_I_N] = { FCH_SW_RST_FUNC, BIT(1) }, 223*7cd3ca90SGary Yang [SW_I3C1_RST_FUNC_G_N] = { FCH_SW_RST_FUNC, BIT(2) }, 224*7cd3ca90SGary Yang [SW_I3C1_RST_FUNC_I_N] = { FCH_SW_RST_FUNC, BIT(3) }, 225*7cd3ca90SGary Yang [SW_UART0_RST_FUNC_N] = { FCH_SW_RST_FUNC, BIT(4) }, 226*7cd3ca90SGary Yang [SW_UART1_RST_FUNC_N] = { FCH_SW_RST_FUNC, BIT(5) }, 227*7cd3ca90SGary Yang [SW_UART2_RST_FUNC_N] = { FCH_SW_RST_FUNC, BIT(6) }, 228*7cd3ca90SGary Yang [SW_UART3_RST_FUNC_N] = { FCH_SW_RST_FUNC, BIT(7) }, 229*7cd3ca90SGary Yang [SW_TIMER_RST_FUNC_N] = { FCH_SW_RST_FUNC, BIT(20) }, 230*7cd3ca90SGary Yang 231*7cd3ca90SGary Yang /* resets for fch_sw_rst_bus */ 232*7cd3ca90SGary Yang [SW_I3C0_RST_APB_N] = { FCH_SW_RST_BUS, BIT(0) }, 233*7cd3ca90SGary Yang [SW_I3C1_RST_APB_N] = { FCH_SW_RST_BUS, BIT(1) }, 234*7cd3ca90SGary Yang [SW_DMA_RST_AXI_N] = { FCH_SW_RST_BUS, BIT(2) }, 235*7cd3ca90SGary Yang [SW_UART0_RST_APB_N] = { FCH_SW_RST_BUS, BIT(4) }, 236*7cd3ca90SGary Yang [SW_UART1_RST_APB_N] = { FCH_SW_RST_BUS, BIT(5) }, 237*7cd3ca90SGary Yang [SW_UART2_RST_APB_N] = { FCH_SW_RST_BUS, BIT(6) }, 238*7cd3ca90SGary Yang [SW_UART3_RST_APB_N] = { FCH_SW_RST_BUS, BIT(7) }, 239*7cd3ca90SGary Yang [SW_SPI0_RST_APB_N] = { FCH_SW_RST_BUS, BIT(8) }, 240*7cd3ca90SGary Yang [SW_SPI1_RST_APB_N] = { FCH_SW_RST_BUS, BIT(9) }, 241*7cd3ca90SGary Yang [SW_I2C0_RST_APB_N] = { FCH_SW_RST_BUS, BIT(12) }, 242*7cd3ca90SGary Yang [SW_I2C1_RST_APB_N] = { FCH_SW_RST_BUS, BIT(13) }, 243*7cd3ca90SGary Yang [SW_I2C2_RST_APB_N] = { FCH_SW_RST_BUS, BIT(14) }, 244*7cd3ca90SGary Yang [SW_I2C3_RST_APB_N] = { FCH_SW_RST_BUS, BIT(15) }, 245*7cd3ca90SGary Yang [SW_I2C4_RST_APB_N] = { FCH_SW_RST_BUS, BIT(16) }, 246*7cd3ca90SGary Yang [SW_I2C5_RST_APB_N] = { FCH_SW_RST_BUS, BIT(17) }, 247*7cd3ca90SGary Yang [SW_I2C6_RST_APB_N] = { FCH_SW_RST_BUS, BIT(18) }, 248*7cd3ca90SGary Yang [SW_I2C7_RST_APB_N] = { FCH_SW_RST_BUS, BIT(19) }, 249*7cd3ca90SGary Yang [SW_GPIO_RST_APB_N] = { FCH_SW_RST_BUS, BIT(21) }, 250*7cd3ca90SGary Yang 251*7cd3ca90SGary Yang /* resets for fch_sw_xspi */ 252*7cd3ca90SGary Yang [SW_XSPI_REG_RST_N] = { FCH_SW_XSPI, BIT(0) }, 253*7cd3ca90SGary Yang [SW_XSPI_SYS_RST_N] = { FCH_SW_XSPI, BIT(1) }, 254*7cd3ca90SGary Yang }; 255*7cd3ca90SGary Yang 256*7cd3ca90SGary Yang static const struct sky1_src_variant variant_sky1_fch = { 257*7cd3ca90SGary Yang .signals = sky1_src_fch_signals, 258*7cd3ca90SGary Yang .signals_num = ARRAY_SIZE(sky1_src_fch_signals), 259*7cd3ca90SGary Yang }; 260*7cd3ca90SGary Yang 261*7cd3ca90SGary Yang static struct sky1_src *to_sky1_src(struct reset_controller_dev *rcdev) 262*7cd3ca90SGary Yang { 263*7cd3ca90SGary Yang return container_of(rcdev, struct sky1_src, rcdev); 264*7cd3ca90SGary Yang } 265*7cd3ca90SGary Yang 266*7cd3ca90SGary Yang static int sky1_reset_set(struct reset_controller_dev *rcdev, 267*7cd3ca90SGary Yang unsigned long id, bool assert) 268*7cd3ca90SGary Yang { 269*7cd3ca90SGary Yang struct sky1_src *sky1src = to_sky1_src(rcdev); 270*7cd3ca90SGary Yang const struct sky1_src_signal *signal = &sky1src->signals[id]; 271*7cd3ca90SGary Yang unsigned int value = assert ? 0 : signal->bit; 272*7cd3ca90SGary Yang 273*7cd3ca90SGary Yang return regmap_update_bits(sky1src->regmap, 274*7cd3ca90SGary Yang signal->offset, signal->bit, value); 275*7cd3ca90SGary Yang } 276*7cd3ca90SGary Yang 277*7cd3ca90SGary Yang static int sky1_reset_assert(struct reset_controller_dev *rcdev, 278*7cd3ca90SGary Yang unsigned long id) 279*7cd3ca90SGary Yang { 280*7cd3ca90SGary Yang sky1_reset_set(rcdev, id, true); 281*7cd3ca90SGary Yang usleep_range(SKY1_RESET_SLEEP_MIN_US, 282*7cd3ca90SGary Yang SKY1_RESET_SLEEP_MAX_US); 283*7cd3ca90SGary Yang return 0; 284*7cd3ca90SGary Yang } 285*7cd3ca90SGary Yang 286*7cd3ca90SGary Yang static int sky1_reset_deassert(struct reset_controller_dev *rcdev, 287*7cd3ca90SGary Yang unsigned long id) 288*7cd3ca90SGary Yang { 289*7cd3ca90SGary Yang sky1_reset_set(rcdev, id, false); 290*7cd3ca90SGary Yang usleep_range(SKY1_RESET_SLEEP_MIN_US, 291*7cd3ca90SGary Yang SKY1_RESET_SLEEP_MAX_US); 292*7cd3ca90SGary Yang return 0; 293*7cd3ca90SGary Yang } 294*7cd3ca90SGary Yang 295*7cd3ca90SGary Yang static int sky1_reset(struct reset_controller_dev *rcdev, 296*7cd3ca90SGary Yang unsigned long id) 297*7cd3ca90SGary Yang { 298*7cd3ca90SGary Yang sky1_reset_assert(rcdev, id); 299*7cd3ca90SGary Yang sky1_reset_deassert(rcdev, id); 300*7cd3ca90SGary Yang return 0; 301*7cd3ca90SGary Yang } 302*7cd3ca90SGary Yang 303*7cd3ca90SGary Yang static int sky1_reset_status(struct reset_controller_dev *rcdev, 304*7cd3ca90SGary Yang unsigned long id) 305*7cd3ca90SGary Yang { 306*7cd3ca90SGary Yang unsigned int value = 0; 307*7cd3ca90SGary Yang struct sky1_src *sky1src = to_sky1_src(rcdev); 308*7cd3ca90SGary Yang const struct sky1_src_signal *signal = &sky1src->signals[id]; 309*7cd3ca90SGary Yang 310*7cd3ca90SGary Yang regmap_read(sky1src->regmap, signal->offset, &value); 311*7cd3ca90SGary Yang return !(value & signal->bit); 312*7cd3ca90SGary Yang } 313*7cd3ca90SGary Yang 314*7cd3ca90SGary Yang static const struct reset_control_ops sky1_src_ops = { 315*7cd3ca90SGary Yang .reset = sky1_reset, 316*7cd3ca90SGary Yang .assert = sky1_reset_assert, 317*7cd3ca90SGary Yang .deassert = sky1_reset_deassert, 318*7cd3ca90SGary Yang .status = sky1_reset_status 319*7cd3ca90SGary Yang }; 320*7cd3ca90SGary Yang 321*7cd3ca90SGary Yang static int sky1_reset_probe(struct platform_device *pdev) 322*7cd3ca90SGary Yang { 323*7cd3ca90SGary Yang struct sky1_src *sky1src; 324*7cd3ca90SGary Yang struct device *dev = &pdev->dev; 325*7cd3ca90SGary Yang const struct sky1_src_variant *variant; 326*7cd3ca90SGary Yang 327*7cd3ca90SGary Yang sky1src = devm_kzalloc(dev, sizeof(*sky1src), GFP_KERNEL); 328*7cd3ca90SGary Yang if (!sky1src) 329*7cd3ca90SGary Yang return -ENOMEM; 330*7cd3ca90SGary Yang 331*7cd3ca90SGary Yang variant = of_device_get_match_data(dev); 332*7cd3ca90SGary Yang 333*7cd3ca90SGary Yang sky1src->regmap = device_node_to_regmap(dev->of_node); 334*7cd3ca90SGary Yang if (IS_ERR(sky1src->regmap)) { 335*7cd3ca90SGary Yang return dev_err_probe(dev, PTR_ERR(sky1src->regmap), 336*7cd3ca90SGary Yang "Unable to get sky1-src regmap"); 337*7cd3ca90SGary Yang } 338*7cd3ca90SGary Yang 339*7cd3ca90SGary Yang sky1src->signals = variant->signals; 340*7cd3ca90SGary Yang sky1src->rcdev.owner = THIS_MODULE; 341*7cd3ca90SGary Yang sky1src->rcdev.nr_resets = variant->signals_num; 342*7cd3ca90SGary Yang sky1src->rcdev.ops = &sky1_src_ops; 343*7cd3ca90SGary Yang sky1src->rcdev.of_node = dev->of_node; 344*7cd3ca90SGary Yang sky1src->rcdev.dev = dev; 345*7cd3ca90SGary Yang 346*7cd3ca90SGary Yang return devm_reset_controller_register(dev, &sky1src->rcdev); 347*7cd3ca90SGary Yang } 348*7cd3ca90SGary Yang 349*7cd3ca90SGary Yang static const struct of_device_id sky1_sysreg_of_match[] = { 350*7cd3ca90SGary Yang { .compatible = "cix,sky1-system-control", .data = &variant_sky1_fch}, 351*7cd3ca90SGary Yang { .compatible = "cix,sky1-s5-system-control", .data = &variant_sky1}, 352*7cd3ca90SGary Yang {}, 353*7cd3ca90SGary Yang }; 354*7cd3ca90SGary Yang MODULE_DEVICE_TABLE(of, sky1_sysreg_of_match); 355*7cd3ca90SGary Yang 356*7cd3ca90SGary Yang static struct platform_driver sky1_reset_driver = { 357*7cd3ca90SGary Yang .probe = sky1_reset_probe, 358*7cd3ca90SGary Yang .driver = { 359*7cd3ca90SGary Yang .name = "cix,sky1-rst", 360*7cd3ca90SGary Yang .of_match_table = sky1_sysreg_of_match, 361*7cd3ca90SGary Yang }, 362*7cd3ca90SGary Yang }; 363*7cd3ca90SGary Yang module_platform_driver(sky1_reset_driver) 364*7cd3ca90SGary Yang 365*7cd3ca90SGary Yang MODULE_AUTHOR("Jerry Zhu <jerry.zhu@cixtech.com>"); 366*7cd3ca90SGary Yang MODULE_DESCRIPTION("Cix Sky1 reset driver"); 367*7cd3ca90SGary Yang MODULE_LICENSE("GPL"); 368