MIPS: BCM63XX: Add support for bcm6368 CPU.
authorMaxime Bizon <mbizon@freebox.fr>
Fri, 4 Nov 2011 18:09:35 +0000 (19:09 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Wed, 7 Dec 2011 22:03:04 +0000 (22:03 +0000)
Signed-off-by: Maxime Bizon <mbizon@freebox.fr>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/2892/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/bcm63xx/Kconfig
arch/mips/bcm63xx/clk.c
arch/mips/bcm63xx/cpu.c
arch/mips/bcm63xx/dev-uart.c
arch/mips/bcm63xx/irq.c
arch/mips/bcm63xx/prom.c
arch/mips/include/asm/mach-bcm63xx/bcm63xx_cpu.h
arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h
arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h
arch/mips/include/asm/mach-bcm63xx/ioremap.h
arch/mips/pci/pci-bcm63xx.c

index fb177d6..6b1b9ad 100644 (file)
@@ -20,6 +20,10 @@ config BCM63XX_CPU_6348
 config BCM63XX_CPU_6358
        bool "support 6358 CPU"
        select HW_HAS_PCI
+
+config BCM63XX_CPU_6368
+       bool "support 6368 CPU"
+       select HW_HAS_PCI
 endmenu
 
 source "arch/mips/bcm63xx/boards/Kconfig"
index 2c68ee9..9d57c71 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/mutex.h>
 #include <linux/err.h>
 #include <linux/clk.h>
+#include <linux/delay.h>
 #include <bcm63xx_cpu.h>
 #include <bcm63xx_io.h>
 #include <bcm63xx_regs.h>
@@ -113,6 +114,34 @@ static struct clk clk_ephy = {
 };
 
 /*
+ * Ethernet switch clock
+ */
+static void enetsw_set(struct clk *clk, int enable)
+{
+       if (!BCMCPU_IS_6368())
+               return;
+       bcm_hwclock_set(CKCTL_6368_ROBOSW_CLK_EN |
+                       CKCTL_6368_SWPKT_USB_EN |
+                       CKCTL_6368_SWPKT_SAR_EN, enable);
+       if (enable) {
+               u32 val;
+
+               /* reset switch core afer clock change */
+               val = bcm_perf_readl(PERF_SOFTRESET_6368_REG);
+               val &= ~SOFTRESET_6368_ENETSW_MASK;
+               bcm_perf_writel(val, PERF_SOFTRESET_6368_REG);
+               msleep(10);
+               val |= SOFTRESET_6368_ENETSW_MASK;
+               bcm_perf_writel(val, PERF_SOFTRESET_6368_REG);
+               msleep(10);
+       }
+}
+
+static struct clk clk_enetsw = {
+       .set    = enetsw_set,
+};
+
+/*
  * PCM clock
  */
 static void pcm_set(struct clk *clk, int enable)
@@ -131,9 +160,10 @@ static struct clk clk_pcm = {
  */
 static void usbh_set(struct clk *clk, int enable)
 {
-       if (!BCMCPU_IS_6348())
-               return;
-       bcm_hwclock_set(CKCTL_6348_USBH_EN, enable);
+       if (BCMCPU_IS_6348())
+               bcm_hwclock_set(CKCTL_6348_USBH_EN, enable);
+       else if (BCMCPU_IS_6368())
+               bcm_hwclock_set(CKCTL_6368_USBH_CLK_EN, enable);
 }
 
 static struct clk clk_usbh = {
@@ -162,6 +192,36 @@ static struct clk clk_spi = {
 };
 
 /*
+ * XTM clock
+ */
+static void xtm_set(struct clk *clk, int enable)
+{
+       if (!BCMCPU_IS_6368())
+               return;
+
+       bcm_hwclock_set(CKCTL_6368_SAR_CLK_EN |
+                       CKCTL_6368_SWPKT_SAR_EN, enable);
+
+       if (enable) {
+               u32 val;
+
+               /* reset sar core afer clock change */
+               val = bcm_perf_readl(PERF_SOFTRESET_6368_REG);
+               val &= ~SOFTRESET_6368_SAR_MASK;
+               bcm_perf_writel(val, PERF_SOFTRESET_6368_REG);
+               mdelay(1);
+               val |= SOFTRESET_6368_SAR_MASK;
+               bcm_perf_writel(val, PERF_SOFTRESET_6368_REG);
+               mdelay(1);
+       }
+}
+
+
+static struct clk clk_xtm = {
+       .set    = xtm_set,
+};
+
+/*
  * Internal peripheral clock
  */
 static struct clk clk_periph = {
@@ -204,12 +264,16 @@ struct clk *clk_get(struct device *dev, const char *id)
                return &clk_enet0;
        if (!strcmp(id, "enet1"))
                return &clk_enet1;
+       if (!strcmp(id, "enetsw"))
+               return &clk_enetsw;
        if (!strcmp(id, "ephy"))
                return &clk_ephy;
        if (!strcmp(id, "usbh"))
                return &clk_usbh;
        if (!strcmp(id, "spi"))
                return &clk_spi;
+       if (!strcmp(id, "xtm"))
+               return &clk_xtm;
        if (!strcmp(id, "periph"))
                return &clk_periph;
        if (BCMCPU_IS_6358() && !strcmp(id, "pcm"))
index 8bd5133..8094168 100644 (file)
@@ -63,6 +63,15 @@ static const int bcm6358_irqs[] = {
 
 };
 
+static const unsigned long bcm6368_regs_base[] = {
+       __GEN_CPU_REGS_TABLE(6368)
+};
+
+static const int bcm6368_irqs[] = {
+       __GEN_CPU_IRQ_TABLE(6368)
+
+};
+
 u16 __bcm63xx_get_cpu_id(void)
 {
        return bcm63xx_cpu_id;
@@ -89,20 +98,19 @@ unsigned int bcm63xx_get_memory_size(void)
 
 static unsigned int detect_cpu_clock(void)
 {
-       unsigned int tmp, n1 = 0, n2 = 0, m1 = 0;
-
-       /* BCM6338 has a fixed 240 Mhz frequency */
-       if (BCMCPU_IS_6338())
+       switch (bcm63xx_get_cpu_id()) {
+       case BCM6338_CPU_ID:
+               /* BCM6338 has a fixed 240 Mhz frequency */
                return 240000000;
 
-       /* BCM6345 has a fixed 140Mhz frequency */
-       if (BCMCPU_IS_6345())
+       case BCM6345_CPU_ID:
+               /* BCM6345 has a fixed 140Mhz frequency */
                return 140000000;
 
-       /*
-        * frequency depends on PLL configuration:
-        */
-       if (BCMCPU_IS_6348()) {
+       case BCM6348_CPU_ID:
+       {
+               unsigned int tmp, n1, n2, m1;
+
                /* 16MHz * (N1 + 1) * (N2 + 2) / (M1_CPU + 1) */
                tmp = bcm_perf_readl(PERF_MIPSPLLCTL_REG);
                n1 = (tmp & MIPSPLLCTL_N1_MASK) >> MIPSPLLCTL_N1_SHIFT;
@@ -111,17 +119,47 @@ static unsigned int detect_cpu_clock(void)
                n1 += 1;
                n2 += 2;
                m1 += 1;
+               return (16 * 1000000 * n1 * n2) / m1;
        }
 
-       if (BCMCPU_IS_6358()) {
+       case BCM6358_CPU_ID:
+       {
+               unsigned int tmp, n1, n2, m1;
+
                /* 16MHz * N1 * N2 / M1_CPU */
                tmp = bcm_ddr_readl(DDR_DMIPSPLLCFG_REG);
                n1 = (tmp & DMIPSPLLCFG_N1_MASK) >> DMIPSPLLCFG_N1_SHIFT;
                n2 = (tmp & DMIPSPLLCFG_N2_MASK) >> DMIPSPLLCFG_N2_SHIFT;
                m1 = (tmp & DMIPSPLLCFG_M1_MASK) >> DMIPSPLLCFG_M1_SHIFT;
+               return (16 * 1000000 * n1 * n2) / m1;
        }
 
-       return (16 * 1000000 * n1 * n2) / m1;
+       case BCM6368_CPU_ID:
+       {
+               unsigned int tmp, p1, p2, ndiv, m1;
+
+               /* (64MHz / P1) * P2 * NDIV / M1_CPU */
+               tmp = bcm_ddr_readl(DDR_DMIPSPLLCFG_6368_REG);
+
+               p1 = (tmp & DMIPSPLLCFG_6368_P1_MASK) >>
+                       DMIPSPLLCFG_6368_P1_SHIFT;
+
+               p2 = (tmp & DMIPSPLLCFG_6368_P2_MASK) >>
+                       DMIPSPLLCFG_6368_P2_SHIFT;
+
+               ndiv = (tmp & DMIPSPLLCFG_6368_NDIV_MASK) >>
+                       DMIPSPLLCFG_6368_NDIV_SHIFT;
+
+               tmp = bcm_ddr_readl(DDR_DMIPSPLLDIV_6368_REG);
+               m1 = (tmp & DMIPSPLLDIV_6368_MDIV_MASK) >>
+                       DMIPSPLLDIV_6368_MDIV_SHIFT;
+
+               return (((64 * 1000000) / p1) * p2 * ndiv) / m1;
+       }
+
+       default:
+               BUG();
+       }
 }
 
 /*
@@ -143,7 +181,7 @@ static unsigned int detect_memory_size(void)
                banks = (val & SDRAM_CFG_BANK_MASK) ? 2 : 1;
        }
 
-       if (BCMCPU_IS_6358()) {
+       if (BCMCPU_IS_6358() || BCMCPU_IS_6368()) {
                val = bcm_memc_readl(MEMC_CFG_REG);
                rows = (val & MEMC_CFG_ROW_MASK) >> MEMC_CFG_ROW_SHIFT;
                cols = (val & MEMC_CFG_COL_MASK) >> MEMC_CFG_COL_SHIFT;
@@ -188,9 +226,18 @@ void __init bcm63xx_cpu_init(void)
                bcm63xx_irqs = bcm6345_irqs;
                break;
        case CPU_BMIPS4350:
-               expected_cpu_id = BCM6358_CPU_ID;
-               bcm63xx_regs_base = bcm6358_regs_base;
-               bcm63xx_irqs = bcm6358_irqs;
+               switch (read_c0_prid() & 0xf0) {
+               case 0x10:
+                       expected_cpu_id = BCM6358_CPU_ID;
+                       bcm63xx_regs_base = bcm6358_regs_base;
+                       bcm63xx_irqs = bcm6358_irqs;
+                       break;
+               case 0x30:
+                       expected_cpu_id = BCM6368_CPU_ID;
+                       bcm63xx_regs_base = bcm6368_regs_base;
+                       bcm63xx_irqs = bcm6368_irqs;
+                       break;
+               }
                break;
        }
 
index c2963da..d6e42c6 100644 (file)
@@ -54,7 +54,7 @@ int __init bcm63xx_uart_register(unsigned int id)
        if (id >= ARRAY_SIZE(bcm63xx_uart_devices))
                return -ENODEV;
 
-       if (id == 1 && !BCMCPU_IS_6358())
+       if (id == 1 && (!BCMCPU_IS_6358() && !BCMCPU_IS_6368()))
                return -ENODEV;
 
        if (id == 0) {
index 9f53884..9a216a4 100644 (file)
@@ -71,6 +71,17 @@ static void __internal_irq_unmask_64(unsigned int irq) __maybe_unused;
 #define ext_irq_cfg_reg1       PERF_EXTIRQ_CFG_REG_6358
 #define ext_irq_cfg_reg2       0
 #endif
+#ifdef CONFIG_BCM63XX_CPU_6368
+#define irq_stat_reg           PERF_IRQSTAT_6368_REG
+#define irq_mask_reg           PERF_IRQMASK_6368_REG
+#define irq_bits               64
+#define is_ext_irq_cascaded    1
+#define ext_irq_start          (BCM_6368_EXT_IRQ0 - IRQ_INTERNAL_BASE)
+#define ext_irq_end            (BCM_6368_EXT_IRQ5 - IRQ_INTERNAL_BASE)
+#define ext_irq_count          6
+#define ext_irq_cfg_reg1       PERF_EXTIRQ_CFG_REG_6368
+#define ext_irq_cfg_reg2       PERF_EXTIRQ_CFG_REG2_6368
+#endif
 
 #if irq_bits == 32
 #define dispatch_internal                      __dispatch_internal
@@ -134,6 +145,17 @@ static void bcm63xx_init_irq(void)
                ext_irq_end = BCM_6358_EXT_IRQ3 - IRQ_INTERNAL_BASE;
                ext_irq_cfg_reg1 = PERF_EXTIRQ_CFG_REG_6358;
                break;
+       case BCM6368_CPU_ID:
+               irq_stat_addr += PERF_IRQSTAT_6368_REG;
+               irq_mask_addr += PERF_IRQMASK_6368_REG;
+               irq_bits = 64;
+               ext_irq_count = 6;
+               is_ext_irq_cascaded = 1;
+               ext_irq_start = BCM_6368_EXT_IRQ0 - IRQ_INTERNAL_BASE;
+               ext_irq_end = BCM_6368_EXT_IRQ5 - IRQ_INTERNAL_BASE;
+               ext_irq_cfg_reg1 = PERF_EXTIRQ_CFG_REG_6368;
+               ext_irq_cfg_reg2 = PERF_EXTIRQ_CFG_REG2_6368;
+               break;
        default:
                BUG();
        }
@@ -406,7 +428,7 @@ static int bcm63xx_external_irq_set_type(struct irq_data *d,
                        reg &= ~EXTIRQ_CFG_BOTHEDGE_6348(irq);
        }
 
-       if (BCMCPU_IS_6338() || BCMCPU_IS_6358()) {
+       if (BCMCPU_IS_6338() || BCMCPU_IS_6358() || BCMCPU_IS_6368()) {
                if (levelsense)
                        reg |= EXTIRQ_CFG_LEVELSENSE(irq);
                else
index be252ef..99d7f40 100644 (file)
@@ -32,9 +32,12 @@ void __init prom_init(void)
                mask = CKCTL_6345_ALL_SAFE_EN;
        else if (BCMCPU_IS_6348())
                mask = CKCTL_6348_ALL_SAFE_EN;
-       else
-               /* BCMCPU_IS_6358() */
+       else if (BCMCPU_IS_6358())
                mask = CKCTL_6358_ALL_SAFE_EN;
+       else if (BCMCPU_IS_6368())
+               mask = CKCTL_6368_ALL_SAFE_EN;
+       else
+               mask = 0;
 
        reg = bcm_perf_readl(PERF_CKCTL_REG);
        reg &= ~mask;
index 46f0332..23403a3 100644 (file)
@@ -13,6 +13,7 @@
 #define BCM6345_CPU_ID         0x6345
 #define BCM6348_CPU_ID         0x6348
 #define BCM6358_CPU_ID         0x6358
+#define BCM6368_CPU_ID         0x6368
 
 void __init bcm63xx_cpu_init(void);
 u16 __bcm63xx_get_cpu_id(void);
@@ -71,6 +72,19 @@ unsigned int bcm63xx_get_cpu_freq(void);
 # define BCMCPU_IS_6358()      (0)
 #endif
 
+#ifdef CONFIG_BCM63XX_CPU_6368
+# ifdef bcm63xx_get_cpu_id
+#  undef bcm63xx_get_cpu_id
+#  define bcm63xx_get_cpu_id() __bcm63xx_get_cpu_id()
+#  define BCMCPU_RUNTIME_DETECT
+# else
+#  define bcm63xx_get_cpu_id() BCM6368_CPU_ID
+# endif
+# define BCMCPU_IS_6368()      (bcm63xx_get_cpu_id() == BCM6368_CPU_ID)
+#else
+# define BCMCPU_IS_6368()      (0)
+#endif
+
 #ifndef bcm63xx_get_cpu_id
 #error "No CPU support configured"
 #endif
@@ -307,6 +321,47 @@ enum bcm63xx_regs_set {
 #define BCM_6358_PCMDMAS_BASE          (0xfffe1a00)
 
 
+/*
+ * 6368 register sets base address
+ */
+#define BCM_6368_DSL_LMEM_BASE         (0xdeadbeef)
+#define BCM_6368_PERF_BASE             (0xb0000000)
+#define BCM_6368_TIMER_BASE            (0xb0000040)
+#define BCM_6368_WDT_BASE              (0xb000005c)
+#define BCM_6368_UART0_BASE            (0xb0000100)
+#define BCM_6368_UART1_BASE            (0xb0000120)
+#define BCM_6368_GPIO_BASE             (0xb0000080)
+#define BCM_6368_SPI_BASE              (0xdeadbeef)
+#define BCM_6368_SPI2_BASE             (0xb0000800)
+#define BCM_6368_UDC0_BASE             (0xdeadbeef)
+#define BCM_6368_OHCI0_BASE            (0xb0001600)
+#define BCM_6368_OHCI_PRIV_BASE                (0xdeadbeef)
+#define BCM_6368_USBH_PRIV_BASE                (0xb0001700)
+#define BCM_6368_MPI_BASE              (0xb0001000)
+#define BCM_6368_PCMCIA_BASE           (0xb0001054)
+#define BCM_6368_SDRAM_REGS_BASE       (0xdeadbeef)
+#define BCM_6368_M2M_BASE              (0xdeadbeef)
+#define BCM_6368_DSL_BASE              (0xdeadbeef)
+#define BCM_6368_ENET0_BASE            (0xdeadbeef)
+#define BCM_6368_ENET1_BASE            (0xdeadbeef)
+#define BCM_6368_ENETDMA_BASE          (0xb0006800)
+#define BCM_6368_ENETDMAC_BASE         (0xb0006a00)
+#define BCM_6368_ENETDMAS_BASE         (0xb0006c00)
+#define BCM_6368_ENETSW_BASE           (0xb0f00000)
+#define BCM_6368_EHCI0_BASE            (0xb0001500)
+#define BCM_6368_SDRAM_BASE            (0xdeadbeef)
+#define BCM_6368_MEMC_BASE             (0xb0001200)
+#define BCM_6368_DDR_BASE              (0xb0001280)
+#define BCM_6368_ATM_BASE              (0xdeadbeef)
+#define BCM_6368_XTM_BASE              (0xb0001800)
+#define BCM_6368_XTMDMA_BASE           (0xb0005000)
+#define BCM_6368_XTMDMAC_BASE          (0xb0005200)
+#define BCM_6368_XTMDMAS_BASE          (0xb0005400)
+#define BCM_6368_PCM_BASE              (0xb0004000)
+#define BCM_6368_PCMDMA_BASE           (0xb0005800)
+#define BCM_6368_PCMDMAC_BASE          (0xb0005a00)
+#define BCM_6368_PCMDMAS_BASE          (0xb0005c00)
+
 
 extern const unsigned long *bcm63xx_regs_base;
 
@@ -410,6 +465,9 @@ static inline unsigned long bcm63xx_regset_address(enum bcm63xx_regs_set set)
 #ifdef CONFIG_BCM63XX_CPU_6358
        __GEN_RSET(6358)
 #endif
+#ifdef CONFIG_BCM63XX_CPU_6368
+       __GEN_RSET(6368)
+#endif
 #endif
        /* unreached */
        return 0;
@@ -574,6 +632,47 @@ enum bcm63xx_irq {
 #define BCM_6358_EXT_IRQ2              (IRQ_INTERNAL_BASE + 27)
 #define BCM_6358_EXT_IRQ3              (IRQ_INTERNAL_BASE + 28)
 
+/*
+ * 6368 irqs
+ */
+#define BCM_6368_HIGH_IRQ_BASE         (IRQ_INTERNAL_BASE + 32)
+
+#define BCM_6368_TIMER_IRQ             (IRQ_INTERNAL_BASE + 0)
+#define BCM_6368_UART0_IRQ             (IRQ_INTERNAL_BASE + 2)
+#define BCM_6368_UART1_IRQ             (IRQ_INTERNAL_BASE + 3)
+#define BCM_6368_DSL_IRQ               (IRQ_INTERNAL_BASE + 4)
+#define BCM_6368_ENET0_IRQ             0
+#define BCM_6368_ENET1_IRQ             0
+#define BCM_6368_ENET_PHY_IRQ          (IRQ_INTERNAL_BASE + 15)
+#define BCM_6368_OHCI0_IRQ             (IRQ_INTERNAL_BASE + 5)
+#define BCM_6368_EHCI0_IRQ             (IRQ_INTERNAL_BASE + 7)
+#define BCM_6368_PCMCIA_IRQ            0
+#define BCM_6368_ENET0_RXDMA_IRQ       0
+#define BCM_6368_ENET0_TXDMA_IRQ       0
+#define BCM_6368_ENET1_RXDMA_IRQ       0
+#define BCM_6368_ENET1_TXDMA_IRQ       0
+#define BCM_6368_PCI_IRQ               (IRQ_INTERNAL_BASE + 13)
+#define BCM_6368_ATM_IRQ               0
+#define BCM_6368_ENETSW_RXDMA0_IRQ     (BCM_6368_HIGH_IRQ_BASE + 0)
+#define BCM_6368_ENETSW_RXDMA1_IRQ     (BCM_6368_HIGH_IRQ_BASE + 1)
+#define BCM_6368_ENETSW_RXDMA2_IRQ     (BCM_6368_HIGH_IRQ_BASE + 2)
+#define BCM_6368_ENETSW_RXDMA3_IRQ     (BCM_6368_HIGH_IRQ_BASE + 3)
+#define BCM_6368_ENETSW_TXDMA0_IRQ     (BCM_6368_HIGH_IRQ_BASE + 4)
+#define BCM_6368_ENETSW_TXDMA1_IRQ     (BCM_6368_HIGH_IRQ_BASE + 5)
+#define BCM_6368_ENETSW_TXDMA2_IRQ     (BCM_6368_HIGH_IRQ_BASE + 6)
+#define BCM_6368_ENETSW_TXDMA3_IRQ     (BCM_6368_HIGH_IRQ_BASE + 7)
+#define BCM_6368_XTM_IRQ               (IRQ_INTERNAL_BASE + 11)
+#define BCM_6368_XTM_DMA0_IRQ          (BCM_6368_HIGH_IRQ_BASE + 8)
+
+#define BCM_6368_PCM_DMA0_IRQ          (BCM_6368_HIGH_IRQ_BASE + 30)
+#define BCM_6368_PCM_DMA1_IRQ          (BCM_6368_HIGH_IRQ_BASE + 31)
+#define BCM_6368_EXT_IRQ0              (IRQ_INTERNAL_BASE + 20)
+#define BCM_6368_EXT_IRQ1              (IRQ_INTERNAL_BASE + 21)
+#define BCM_6368_EXT_IRQ2              (IRQ_INTERNAL_BASE + 22)
+#define BCM_6368_EXT_IRQ3              (IRQ_INTERNAL_BASE + 23)
+#define BCM_6368_EXT_IRQ4              (IRQ_INTERNAL_BASE + 24)
+#define BCM_6368_EXT_IRQ5              (IRQ_INTERNAL_BASE + 25)
+
 extern const int *bcm63xx_irqs;
 
 #define __GEN_CPU_IRQ_TABLE(__cpu)                                     \
index 3999ec0..3d5de96 100644 (file)
@@ -14,6 +14,8 @@ static inline unsigned long bcm63xx_gpio_count(void)
                return 8;
        case BCM6345_CPU_ID:
                return 16;
+       case BCM6368_CPU_ID:
+               return 38;
        case BCM6348_CPU_ID:
        default:
                return 37;
index 2b3a2d6..5005750 100644 (file)
                                        CKCTL_6358_USBSU_EN |           \
                                        CKCTL_6358_EPHY_EN)
 
+#define CKCTL_6368_VDSL_QPROC_EN       (1 << 2)
+#define CKCTL_6368_VDSL_AFE_EN         (1 << 3)
+#define CKCTL_6368_VDSL_BONDING_EN     (1 << 4)
+#define CKCTL_6368_VDSL_EN             (1 << 5)
+#define CKCTL_6368_PHYMIPS_EN          (1 << 6)
+#define CKCTL_6368_SWPKT_USB_EN                (1 << 7)
+#define CKCTL_6368_SWPKT_SAR_EN                (1 << 8)
+#define CKCTL_6368_SPI_CLK_EN          (1 << 9)
+#define CKCTL_6368_USBD_CLK_EN         (1 << 10)
+#define CKCTL_6368_SAR_CLK_EN          (1 << 11)
+#define CKCTL_6368_ROBOSW_CLK_EN       (1 << 12)
+#define CKCTL_6368_UTOPIA_CLK_EN       (1 << 13)
+#define CKCTL_6368_PCM_CLK_EN          (1 << 14)
+#define CKCTL_6368_USBH_CLK_EN         (1 << 15)
+#define CKCTL_6368_DISABLE_GLESS_EN    (1 << 16)
+#define CKCTL_6368_NAND_CLK_EN         (1 << 17)
+#define CKCTL_6368_IPSEC_CLK_EN                (1 << 17)
+
+#define CKCTL_6368_ALL_SAFE_EN         (CKCTL_6368_SWPKT_USB_EN |      \
+                                       CKCTL_6368_SWPKT_SAR_EN |       \
+                                       CKCTL_6368_SPI_CLK_EN |         \
+                                       CKCTL_6368_USBD_CLK_EN |        \
+                                       CKCTL_6368_SAR_CLK_EN |         \
+                                       CKCTL_6368_ROBOSW_CLK_EN |      \
+                                       CKCTL_6368_UTOPIA_CLK_EN |      \
+                                       CKCTL_6368_PCM_CLK_EN |         \
+                                       CKCTL_6368_USBH_CLK_EN |        \
+                                       CKCTL_6368_DISABLE_GLESS_EN |   \
+                                       CKCTL_6368_NAND_CLK_EN |        \
+                                       CKCTL_6368_IPSEC_CLK_EN)
+
 /* System PLL Control register  */
 #define PERF_SYS_PLL_CTL_REG           0x8
 #define SYS_PLL_SOFT_RESET             0x1
 #define PERF_IRQMASK_6345_REG          0xc
 #define PERF_IRQMASK_6348_REG          0xc
 #define PERF_IRQMASK_6358_REG          0xc
+#define PERF_IRQMASK_6368_REG          0x20
 
 /* Interrupt Status register */
 #define PERF_IRQSTAT_6338_REG          0x10
 #define PERF_IRQSTAT_6345_REG          0x10
 #define PERF_IRQSTAT_6348_REG          0x10
 #define PERF_IRQSTAT_6358_REG          0x10
+#define PERF_IRQSTAT_6368_REG          0x28
 
 /* External Interrupt Configuration register */
 #define PERF_EXTIRQ_CFG_REG_6338       0x14
 #define PERF_EXTIRQ_CFG_REG_6348       0x14
 #define PERF_EXTIRQ_CFG_REG_6358       0x14
+#define PERF_EXTIRQ_CFG_REG_6368       0x18
+
+#define PERF_EXTIRQ_CFG_REG2_6368      0x1c
 
 /* for 6348 only */
 #define EXTIRQ_CFG_SENSE_6348(x)       (1 << (x))
 
 /* Soft Reset register */
 #define PERF_SOFTRESET_REG             0x28
+#define PERF_SOFTRESET_6368_REG                0x10
 
 #define SOFTRESET_6338_SPI_MASK                (1 << 0)
 #define SOFTRESET_6338_ENET_MASK       (1 << 2)
                                  SOFTRESET_6348_ACLC_MASK |            \
                                  SOFTRESET_6348_ADSLMIPSPLL_MASK)
 
+#define SOFTRESET_6368_SPI_MASK                (1 << 0)
+#define SOFTRESET_6368_MPI_MASK                (1 << 3)
+#define SOFTRESET_6368_EPHY_MASK       (1 << 6)
+#define SOFTRESET_6368_SAR_MASK                (1 << 7)
+#define SOFTRESET_6368_ENETSW_MASK     (1 << 10)
+#define SOFTRESET_6368_USBS_MASK       (1 << 11)
+#define SOFTRESET_6368_USBH_MASK       (1 << 12)
+#define SOFTRESET_6368_PCM_MASK                (1 << 13)
+
 /* MIPS PLL control register */
 #define PERF_MIPSPLLCTL_REG            0x34
 #define MIPSPLLCTL_N1_SHIFT            20
 #define GPIO_MODE_6358_SERIAL_LED      (1 << 10)
 #define GPIO_MODE_6358_UTOPIA          (1 << 12)
 
+#define GPIO_MODE_6368_ANALOG_AFE_0    (1 << 0)
+#define GPIO_MODE_6368_ANALOG_AFE_1    (1 << 1)
+#define GPIO_MODE_6368_SYS_IRQ         (1 << 2)
+#define GPIO_MODE_6368_SERIAL_LED_DATA (1 << 3)
+#define GPIO_MODE_6368_SERIAL_LED_CLK  (1 << 4)
+#define GPIO_MODE_6368_INET_LED                (1 << 5)
+#define GPIO_MODE_6368_EPHY0_LED       (1 << 6)
+#define GPIO_MODE_6368_EPHY1_LED       (1 << 7)
+#define GPIO_MODE_6368_EPHY2_LED       (1 << 8)
+#define GPIO_MODE_6368_EPHY3_LED       (1 << 9)
+#define GPIO_MODE_6368_ROBOSW_LED_DAT  (1 << 10)
+#define GPIO_MODE_6368_ROBOSW_LED_CLK  (1 << 11)
+#define GPIO_MODE_6368_ROBOSW_LED0     (1 << 12)
+#define GPIO_MODE_6368_ROBOSW_LED1     (1 << 13)
+#define GPIO_MODE_6368_USBD_LED                (1 << 14)
+#define GPIO_MODE_6368_NTR_PULSE       (1 << 15)
+#define GPIO_MODE_6368_PCI_REQ1                (1 << 16)
+#define GPIO_MODE_6368_PCI_GNT1                (1 << 17)
+#define GPIO_MODE_6368_PCI_INTB                (1 << 18)
+#define GPIO_MODE_6368_PCI_REQ0                (1 << 19)
+#define GPIO_MODE_6368_PCI_GNT0                (1 << 20)
+#define GPIO_MODE_6368_PCMCIA_CD1      (1 << 22)
+#define GPIO_MODE_6368_PCMCIA_CD2      (1 << 23)
+#define GPIO_MODE_6368_PCMCIA_VS1      (1 << 24)
+#define GPIO_MODE_6368_PCMCIA_VS2      (1 << 25)
+#define GPIO_MODE_6368_EBI_CS2         (1 << 26)
+#define GPIO_MODE_6368_EBI_CS3         (1 << 27)
+#define GPIO_MODE_6368_SPI_SSN2                (1 << 28)
+#define GPIO_MODE_6368_SPI_SSN3                (1 << 29)
+#define GPIO_MODE_6368_SPI_SSN4                (1 << 30)
+#define GPIO_MODE_6368_SPI_SSN5                (1 << 31)
+
+
+#define GPIO_BASEMODE_6368_REG         0x38
+#define GPIO_BASEMODE_6368_UART2       0x1
+#define GPIO_BASEMODE_6368_GPIO                0x0
+#define GPIO_BASEMODE_6368_MASK                0x7
+/* those bits must be kept as read in gpio basemode register*/
 
 /*************************************************************************
  * _REG relative to RSET_ENET
  * _REG relative to RSET_USBH_PRIV
  *************************************************************************/
 
-#define USBH_PRIV_SWAP_REG             0x0
+#define USBH_PRIV_SWAP_6358_REG                0x0
+#define USBH_PRIV_SWAP_6368_REG                0x1c
+
 #define USBH_PRIV_SWAP_EHCI_ENDN_SHIFT 4
 #define USBH_PRIV_SWAP_EHCI_ENDN_MASK  (1 << USBH_PRIV_SWAP_EHCI_ENDN_SHIFT)
 #define USBH_PRIV_SWAP_EHCI_DATA_SHIFT 3
 #define USBH_PRIV_SWAP_OHCI_DATA_SHIFT 0
 #define USBH_PRIV_SWAP_OHCI_DATA_MASK  (1 << USBH_PRIV_SWAP_OHCI_DATA_SHIFT)
 
-#define USBH_PRIV_TEST_REG             0x24
+#define USBH_PRIV_TEST_6358_REG                0x24
+#define USBH_PRIV_TEST_6368_REG                0x14
+
+#define USBH_PRIV_SETUP_6368_REG       0x28
+#define USBH_PRIV_SETUP_IOC_SHIFT      4
+#define USBH_PRIV_SETUP_IOC_MASK       (1 << USBH_PRIV_SETUP_IOC_SHIFT)
+
 
 
 /*************************************************************************
 #define DMIPSPLLCFG_N2_SHIFT           29
 #define DMIPSPLLCFG_N2_MASK            (0x7 << DMIPSPLLCFG_N2_SHIFT)
 
+#define DDR_DMIPSPLLCFG_6368_REG       0x20
+#define DMIPSPLLCFG_6368_P1_SHIFT      0
+#define DMIPSPLLCFG_6368_P1_MASK       (0xf << DMIPSPLLCFG_6368_P1_SHIFT)
+#define DMIPSPLLCFG_6368_P2_SHIFT      4
+#define DMIPSPLLCFG_6368_P2_MASK       (0xf << DMIPSPLLCFG_6368_P2_SHIFT)
+#define DMIPSPLLCFG_6368_NDIV_SHIFT    16
+#define DMIPSPLLCFG_6368_NDIV_MASK     (0x1ff << DMIPSPLLCFG_6368_NDIV_SHIFT)
+
+#define DDR_DMIPSPLLDIV_6368_REG       0x24
+#define DMIPSPLLDIV_6368_MDIV_SHIFT    0
+#define DMIPSPLLDIV_6368_MDIV_MASK     (0xff << DMIPSPLLDIV_6368_MDIV_SHIFT)
+
+
 /*************************************************************************
  * _REG relative to RSET_M2M
  *************************************************************************/
index e3fe04d..ef94ba7 100644 (file)
@@ -18,6 +18,10 @@ static inline int is_bcm63xx_internal_registers(phys_t offset)
                if (offset >= 0xfff00000)
                        return 1;
                break;
+       case BCM6368_CPU_ID:
+               if (offset >= 0xb0000000 && offset < 0xb1000000)
+                       return 1;
+               break;
        }
        return 0;
 }
index 82e0fde..39eb7c4 100644 (file)
@@ -99,7 +99,7 @@ static int __init bcm63xx_pci_init(void)
        unsigned int mem_size;
        u32 val;
 
-       if (!BCMCPU_IS_6348() && !BCMCPU_IS_6358())
+       if (!BCMCPU_IS_6348() && !BCMCPU_IS_6358() && !BCMCPU_IS_6368())
                return -ENODEV;
 
        if (!bcm63xx_pci_enabled)
@@ -159,7 +159,7 @@ static int __init bcm63xx_pci_init(void)
        /* setup PCI to local bus access, used by PCI device to target
         * local RAM while bus mastering */
        bcm63xx_int_cfg_writel(0, PCI_BASE_ADDRESS_3);
-       if (BCMCPU_IS_6358())
+       if (BCMCPU_IS_6358() || BCMCPU_IS_6368())
                val = MPI_SP0_REMAP_ENABLE_MASK;
        else
                val = 0;