0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/init.h>
0010 #include <linux/export.h>
0011 #include <linux/mutex.h>
0012 #include <linux/err.h>
0013 #include <linux/clk.h>
0014 #include <linux/delay.h>
0015 #include <bcm63xx_cpu.h>
0016 #include <bcm63xx_io.h>
0017 #include <bcm63xx_regs.h>
0018 #include <bcm63xx_reset.h>
0019
0020 #define __GEN_RESET_BITS_TABLE(__cpu) \
0021 [BCM63XX_RESET_SPI] = BCM## __cpu ##_RESET_SPI, \
0022 [BCM63XX_RESET_ENET] = BCM## __cpu ##_RESET_ENET, \
0023 [BCM63XX_RESET_USBH] = BCM## __cpu ##_RESET_USBH, \
0024 [BCM63XX_RESET_USBD] = BCM## __cpu ##_RESET_USBD, \
0025 [BCM63XX_RESET_DSL] = BCM## __cpu ##_RESET_DSL, \
0026 [BCM63XX_RESET_SAR] = BCM## __cpu ##_RESET_SAR, \
0027 [BCM63XX_RESET_EPHY] = BCM## __cpu ##_RESET_EPHY, \
0028 [BCM63XX_RESET_ENETSW] = BCM## __cpu ##_RESET_ENETSW, \
0029 [BCM63XX_RESET_PCM] = BCM## __cpu ##_RESET_PCM, \
0030 [BCM63XX_RESET_MPI] = BCM## __cpu ##_RESET_MPI, \
0031 [BCM63XX_RESET_PCIE] = BCM## __cpu ##_RESET_PCIE, \
0032 [BCM63XX_RESET_PCIE_EXT] = BCM## __cpu ##_RESET_PCIE_EXT,
0033
0034 #define BCM3368_RESET_SPI SOFTRESET_3368_SPI_MASK
0035 #define BCM3368_RESET_ENET SOFTRESET_3368_ENET_MASK
0036 #define BCM3368_RESET_USBH 0
0037 #define BCM3368_RESET_USBD SOFTRESET_3368_USBS_MASK
0038 #define BCM3368_RESET_DSL 0
0039 #define BCM3368_RESET_SAR 0
0040 #define BCM3368_RESET_EPHY SOFTRESET_3368_EPHY_MASK
0041 #define BCM3368_RESET_ENETSW 0
0042 #define BCM3368_RESET_PCM SOFTRESET_3368_PCM_MASK
0043 #define BCM3368_RESET_MPI SOFTRESET_3368_MPI_MASK
0044 #define BCM3368_RESET_PCIE 0
0045 #define BCM3368_RESET_PCIE_EXT 0
0046
0047 #define BCM6328_RESET_SPI SOFTRESET_6328_SPI_MASK
0048 #define BCM6328_RESET_ENET 0
0049 #define BCM6328_RESET_USBH SOFTRESET_6328_USBH_MASK
0050 #define BCM6328_RESET_USBD SOFTRESET_6328_USBS_MASK
0051 #define BCM6328_RESET_DSL 0
0052 #define BCM6328_RESET_SAR SOFTRESET_6328_SAR_MASK
0053 #define BCM6328_RESET_EPHY SOFTRESET_6328_EPHY_MASK
0054 #define BCM6328_RESET_ENETSW SOFTRESET_6328_ENETSW_MASK
0055 #define BCM6328_RESET_PCM SOFTRESET_6328_PCM_MASK
0056 #define BCM6328_RESET_MPI 0
0057 #define BCM6328_RESET_PCIE \
0058 (SOFTRESET_6328_PCIE_MASK | \
0059 SOFTRESET_6328_PCIE_CORE_MASK | \
0060 SOFTRESET_6328_PCIE_HARD_MASK)
0061 #define BCM6328_RESET_PCIE_EXT SOFTRESET_6328_PCIE_EXT_MASK
0062
0063 #define BCM6338_RESET_SPI SOFTRESET_6338_SPI_MASK
0064 #define BCM6338_RESET_ENET SOFTRESET_6338_ENET_MASK
0065 #define BCM6338_RESET_USBH SOFTRESET_6338_USBH_MASK
0066 #define BCM6338_RESET_USBD SOFTRESET_6338_USBS_MASK
0067 #define BCM6338_RESET_DSL SOFTRESET_6338_ADSL_MASK
0068 #define BCM6338_RESET_SAR SOFTRESET_6338_SAR_MASK
0069 #define BCM6338_RESET_EPHY 0
0070 #define BCM6338_RESET_ENETSW 0
0071 #define BCM6338_RESET_PCM 0
0072 #define BCM6338_RESET_MPI 0
0073 #define BCM6338_RESET_PCIE 0
0074 #define BCM6338_RESET_PCIE_EXT 0
0075
0076 #define BCM6348_RESET_SPI SOFTRESET_6348_SPI_MASK
0077 #define BCM6348_RESET_ENET SOFTRESET_6348_ENET_MASK
0078 #define BCM6348_RESET_USBH SOFTRESET_6348_USBH_MASK
0079 #define BCM6348_RESET_USBD SOFTRESET_6348_USBS_MASK
0080 #define BCM6348_RESET_DSL SOFTRESET_6348_ADSL_MASK
0081 #define BCM6348_RESET_SAR SOFTRESET_6348_SAR_MASK
0082 #define BCM6348_RESET_EPHY 0
0083 #define BCM6348_RESET_ENETSW 0
0084 #define BCM6348_RESET_PCM 0
0085 #define BCM6348_RESET_MPI 0
0086 #define BCM6348_RESET_PCIE 0
0087 #define BCM6348_RESET_PCIE_EXT 0
0088
0089 #define BCM6358_RESET_SPI SOFTRESET_6358_SPI_MASK
0090 #define BCM6358_RESET_ENET SOFTRESET_6358_ENET_MASK
0091 #define BCM6358_RESET_USBH SOFTRESET_6358_USBH_MASK
0092 #define BCM6358_RESET_USBD 0
0093 #define BCM6358_RESET_DSL SOFTRESET_6358_ADSL_MASK
0094 #define BCM6358_RESET_SAR SOFTRESET_6358_SAR_MASK
0095 #define BCM6358_RESET_EPHY SOFTRESET_6358_EPHY_MASK
0096 #define BCM6358_RESET_ENETSW 0
0097 #define BCM6358_RESET_PCM SOFTRESET_6358_PCM_MASK
0098 #define BCM6358_RESET_MPI SOFTRESET_6358_MPI_MASK
0099 #define BCM6358_RESET_PCIE 0
0100 #define BCM6358_RESET_PCIE_EXT 0
0101
0102 #define BCM6362_RESET_SPI SOFTRESET_6362_SPI_MASK
0103 #define BCM6362_RESET_ENET 0
0104 #define BCM6362_RESET_USBH SOFTRESET_6362_USBH_MASK
0105 #define BCM6362_RESET_USBD SOFTRESET_6362_USBS_MASK
0106 #define BCM6362_RESET_DSL 0
0107 #define BCM6362_RESET_SAR SOFTRESET_6362_SAR_MASK
0108 #define BCM6362_RESET_EPHY SOFTRESET_6362_EPHY_MASK
0109 #define BCM6362_RESET_ENETSW SOFTRESET_6362_ENETSW_MASK
0110 #define BCM6362_RESET_PCM SOFTRESET_6362_PCM_MASK
0111 #define BCM6362_RESET_MPI 0
0112 #define BCM6362_RESET_PCIE (SOFTRESET_6362_PCIE_MASK | \
0113 SOFTRESET_6362_PCIE_CORE_MASK)
0114 #define BCM6362_RESET_PCIE_EXT SOFTRESET_6362_PCIE_EXT_MASK
0115
0116 #define BCM6368_RESET_SPI SOFTRESET_6368_SPI_MASK
0117 #define BCM6368_RESET_ENET 0
0118 #define BCM6368_RESET_USBH SOFTRESET_6368_USBH_MASK
0119 #define BCM6368_RESET_USBD SOFTRESET_6368_USBS_MASK
0120 #define BCM6368_RESET_DSL 0
0121 #define BCM6368_RESET_SAR SOFTRESET_6368_SAR_MASK
0122 #define BCM6368_RESET_EPHY SOFTRESET_6368_EPHY_MASK
0123 #define BCM6368_RESET_ENETSW SOFTRESET_6368_ENETSW_MASK
0124 #define BCM6368_RESET_PCM SOFTRESET_6368_PCM_MASK
0125 #define BCM6368_RESET_MPI SOFTRESET_6368_MPI_MASK
0126 #define BCM6368_RESET_PCIE 0
0127 #define BCM6368_RESET_PCIE_EXT 0
0128
0129
0130
0131
0132 static const u32 bcm3368_reset_bits[] = {
0133 __GEN_RESET_BITS_TABLE(3368)
0134 };
0135
0136 static const u32 bcm6328_reset_bits[] = {
0137 __GEN_RESET_BITS_TABLE(6328)
0138 };
0139
0140 static const u32 bcm6338_reset_bits[] = {
0141 __GEN_RESET_BITS_TABLE(6338)
0142 };
0143
0144 static const u32 bcm6348_reset_bits[] = {
0145 __GEN_RESET_BITS_TABLE(6348)
0146 };
0147
0148 static const u32 bcm6358_reset_bits[] = {
0149 __GEN_RESET_BITS_TABLE(6358)
0150 };
0151
0152 static const u32 bcm6362_reset_bits[] = {
0153 __GEN_RESET_BITS_TABLE(6362)
0154 };
0155
0156 static const u32 bcm6368_reset_bits[] = {
0157 __GEN_RESET_BITS_TABLE(6368)
0158 };
0159
0160 const u32 *bcm63xx_reset_bits;
0161 static int reset_reg;
0162
0163 static int __init bcm63xx_reset_bits_init(void)
0164 {
0165 if (BCMCPU_IS_3368()) {
0166 reset_reg = PERF_SOFTRESET_6358_REG;
0167 bcm63xx_reset_bits = bcm3368_reset_bits;
0168 } else if (BCMCPU_IS_6328()) {
0169 reset_reg = PERF_SOFTRESET_6328_REG;
0170 bcm63xx_reset_bits = bcm6328_reset_bits;
0171 } else if (BCMCPU_IS_6338()) {
0172 reset_reg = PERF_SOFTRESET_REG;
0173 bcm63xx_reset_bits = bcm6338_reset_bits;
0174 } else if (BCMCPU_IS_6348()) {
0175 reset_reg = PERF_SOFTRESET_REG;
0176 bcm63xx_reset_bits = bcm6348_reset_bits;
0177 } else if (BCMCPU_IS_6358()) {
0178 reset_reg = PERF_SOFTRESET_6358_REG;
0179 bcm63xx_reset_bits = bcm6358_reset_bits;
0180 } else if (BCMCPU_IS_6362()) {
0181 reset_reg = PERF_SOFTRESET_6362_REG;
0182 bcm63xx_reset_bits = bcm6362_reset_bits;
0183 } else if (BCMCPU_IS_6368()) {
0184 reset_reg = PERF_SOFTRESET_6368_REG;
0185 bcm63xx_reset_bits = bcm6368_reset_bits;
0186 }
0187
0188 return 0;
0189 }
0190
0191 static DEFINE_SPINLOCK(reset_mutex);
0192
0193 static void __bcm63xx_core_set_reset(u32 mask, int enable)
0194 {
0195 unsigned long flags;
0196 u32 val;
0197
0198 if (!mask)
0199 return;
0200
0201 spin_lock_irqsave(&reset_mutex, flags);
0202 val = bcm_perf_readl(reset_reg);
0203
0204 if (enable)
0205 val &= ~mask;
0206 else
0207 val |= mask;
0208
0209 bcm_perf_writel(val, reset_reg);
0210 spin_unlock_irqrestore(&reset_mutex, flags);
0211 }
0212
0213 void bcm63xx_core_set_reset(enum bcm63xx_core_reset core, int reset)
0214 {
0215 __bcm63xx_core_set_reset(bcm63xx_reset_bits[core], reset);
0216 }
0217 EXPORT_SYMBOL(bcm63xx_core_set_reset);
0218
0219 postcore_initcall(bcm63xx_reset_bits_init);