Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * This file is subject to the terms and conditions of the GNU General Public
0003  * License.  See the file "COPYING" in the main directory of this archive
0004  * for more details.
0005  *
0006  * Copyright (C) 2012 Jonas Gorski <jonas.gorski@gmail.com>
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  * core reset bits
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);