linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / arch / ppc / platforms / lite5200.c
index b9e9db6..7ed52dc 100644 (file)
@@ -1,4 +1,6 @@
 /*
+ * arch/ppc/platforms/lite5200.c
+ *
  * Platform support file for the Freescale LITE5200 based on MPC52xx.
  * A maximum of this file should be moved to syslib/mpc52xx_?????
  * so that new platform based on MPC52xx need a minimal platform file
@@ -21,6 +23,7 @@
  * kind, whether express or implied.
  */
 
+#include <linux/config.h>
 #include <linux/initrd.h>
 #include <linux/seq_file.h>
 #include <linux/kdev_t.h>
@@ -33,7 +36,8 @@
 #include <asm/mpc52xx.h>
 #include <asm/ppc_sys.h>
 #include <asm/machdep.h>
-#include <asm/pci-bridge.h>
+
+#include <syslib/mpc52xx_pci.h>
 
 
 extern int powersave_nap;
@@ -66,53 +70,44 @@ lite5200_show_cpuinfo(struct seq_file *m)
 }
 
 #ifdef CONFIG_PCI
-#ifdef CONFIG_LITE5200B
-static int
-lite5200_map_irq(struct pci_dev *dev, unsigned char idsel,
-                   unsigned char pin)
-{
-       static char pci_irq_table[][4] =
-       /*
-        *      PCI IDSEL/INTPIN->INTLINE
-        *        A             B             C             D
-        */
-       {
-               {MPC52xx_IRQ0, MPC52xx_IRQ1, MPC52xx_IRQ2, MPC52xx_IRQ3},
-               {MPC52xx_IRQ1, MPC52xx_IRQ2, MPC52xx_IRQ3, MPC52xx_IRQ0},
-       };
-
-       const long min_idsel = 24, max_idsel = 25, irqs_per_slot = 4;
-       return PCI_IRQ_TABLE_LOOKUP;
-}
-#else /* Original Lite */
 static int
 lite5200_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin)
 {
        return (pin == 1) && (idsel==24) ? MPC52xx_IRQ0 : -1;
 }
 #endif
-#endif
 
 static void __init
 lite5200_setup_cpu(void)
 {
+       struct mpc52xx_cdm  __iomem *cdm;
        struct mpc52xx_gpio __iomem *gpio;
        struct mpc52xx_intr __iomem *intr;
+       struct mpc52xx_xlb  __iomem *xlb;
 
        u32 port_config;
        u32 intr_ctrl;
 
        /* Map zones */
+       cdm  = ioremap(MPC52xx_PA(MPC52xx_CDM_OFFSET), MPC52xx_CDM_SIZE);
        gpio = ioremap(MPC52xx_PA(MPC52xx_GPIO_OFFSET), MPC52xx_GPIO_SIZE);
+       xlb  = ioremap(MPC52xx_PA(MPC52xx_XLB_OFFSET), MPC52xx_XLB_SIZE);
        intr = ioremap(MPC52xx_PA(MPC52xx_INTR_OFFSET), MPC52xx_INTR_SIZE);
 
-       if (!gpio || !intr) {
-               printk(KERN_ERR __FILE__ ": "
-                       "Error while mapping GPIO/INTR during "
-                       "lite5200_setup_cpu\n");
+       if (!cdm || !gpio || !xlb || !intr) {
+               printk("lite5200.c: Error while mapping CDM/GPIO/XLB/INTR during"
+                               "lite5200_setup_cpu\n");
                goto unmap_regs;
        }
 
+       /* Use internal 48 Mhz */
+       out_8(&cdm->ext_48mhz_en, 0x00);
+       out_8(&cdm->fd_enable, 0x01);
+       if (in_be32(&cdm->rstcfg) & 0x40)       /* Assumes 33Mhz clock */
+               out_be16(&cdm->fd_counters, 0x0001);
+       else
+               out_be16(&cdm->fd_counters, 0x5555);
+
        /* Get port mux config */
        port_config = in_be32(&gpio->port_config);
 
@@ -123,29 +118,29 @@ lite5200_setup_cpu(void)
        port_config &= ~0x00007000;     /* Differential mode - USB1 only */
        port_config |=  0x00001000;
 
-       /* ATA CS is on csb_4/5 */
-       port_config &= ~0x03000000;
-       port_config |=  0x01000000;
-
        /* Commit port config */
        out_be32(&gpio->port_config, port_config);
 
-       /* IRQ[0-3] setup */
+       /* Configure the XLB Arbiter */
+       out_be32(&xlb->master_pri_enable, 0xff);
+       out_be32(&xlb->master_priority, 0x11111111);
+
+       /* Enable ram snooping for 1GB window */
+       out_be32(&xlb->config, in_be32(&xlb->config) | MPC52xx_XLB_CFG_SNOOP);
+       out_be32(&xlb->snoop_window, MPC52xx_PCI_TARGET_MEM | 0x1d);
+
+       /* IRQ[0-3] setup : IRQ0     - Level Active Low  */
+       /*                  IRQ[1-3] - Level Active High */
        intr_ctrl = in_be32(&intr->ctrl);
        intr_ctrl &= ~0x00ff0000;
-#ifdef CONFIG_LITE5200B
-       /* IRQ[0-3] Level Active Low */
-       intr_ctrl |=  0x00ff0000;
-#else
-       /* IRQ0 Level Active Low
-        * IRQ[1-3] Level Active High */
-       intr_ctrl |=  0x00c00000;
-#endif
+       intr_ctrl |=  0x00c00000;
        out_be32(&intr->ctrl, intr_ctrl);
 
        /* Unmap reg zone */
 unmap_regs:
+       if (cdm)  iounmap(cdm);
        if (gpio) iounmap(gpio);
+       if (xlb)  iounmap(xlb);
        if (intr) iounmap(intr);
 }
 
@@ -153,8 +148,7 @@ static void __init
 lite5200_setup_arch(void)
 {
        /* CPU & Port mux setup */
-       mpc52xx_setup_cpu();    /* Generic */
-       lite5200_setup_cpu();   /* Platform specific */
+       lite5200_setup_cpu();
 
 #ifdef CONFIG_PCI
        /* PCI Bridge setup */