]> pilppa.com Git - linux-2.6-omap-h63xx.git/commitdiff
[ARM] Kirkwood: add support for newer SoC models
authorRonen Shitrit <rshitrit@marvell.com>
Mon, 15 Sep 2008 07:40:35 +0000 (10:40 +0300)
committerNicolas Pitre <nico@cam.org>
Thu, 25 Sep 2008 20:27:21 +0000 (16:27 -0400)
Add support to the Kirkwood port for newer device models and silicon
revisions.  Instead of looking at the DEVICE_ID register, the device
version is now determined by looking at the PCI-Express device ID and
revision registers, as it is done for orion5x, and this information
is used to determine the TCLK frequency, again, as it is done for
orion5x.

Signed-off-by: Ronen Shitrit <rshitrit@marvell.com>
Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
arch/arm/mach-kirkwood/common.c
arch/arm/mach-kirkwood/common.h
arch/arm/mach-kirkwood/include/mach/kirkwood.h
arch/arm/mach-kirkwood/pcie.c

index 2e79dabac53cd3787b0e67f8ad78a02270e31f10..c8516e352d1c2537b06599acbe5f256ec5effe61 100644 (file)
@@ -532,6 +532,12 @@ int kirkwood_tclk;
 
 int __init kirkwood_find_tclk(void)
 {
+       u32 dev, rev;
+
+       kirkwood_pcie_id(&dev, &rev);
+       if (dev == MV88F6281_DEV_ID && rev == MV88F6281_REV_A0)
+               return 200000000;
+
        return 166666667;
 }
 
@@ -549,18 +555,37 @@ struct sys_timer kirkwood_timer = {
 /*****************************************************************************
  * General
  ****************************************************************************/
+/*
+ * Identify device ID and revision.
+ */
 static char * __init kirkwood_id(void)
 {
-       switch (readl(DEVICE_ID) & 0x3) {
-       case 0:
-               return "88F6180";
-       case 1:
-               return "88F6192";
-       case 2:
-               return "88F6281";
+       u32 dev, rev;
+
+       kirkwood_pcie_id(&dev, &rev);
+
+       if (dev == MV88F6281_DEV_ID) {
+               if (rev == MV88F6281_REV_Z0)
+                       return "MV88F6281-Z0";
+               else if (rev == MV88F6281_REV_A0)
+                       return "MV88F6281-A0";
+               else
+                       return "MV88F6281-Rev-Unsupported";
+       } else if (dev == MV88F6192_DEV_ID) {
+               if (rev == MV88F6192_REV_Z0)
+                       return "MV88F6192-Z0";
+               else if (rev == MV88F6192_REV_A0)
+                       return "MV88F6192-A0";
+               else
+                       return "MV88F6192-Rev-Unsupported";
+       } else if (dev == MV88F6180_DEV_ID) {
+               if (rev == MV88F6180_REV_A0)
+                       return "MV88F6180-Rev-A0";
+               else
+                       return "MV88F6180-Rev-Unsupported";
+       } else {
+               return "Device-Unknown";
        }
-
-       return "unknown 88F6000 variant";
 }
 
 static int __init is_l2_writethrough(void)
index 69cd113af03adcd3c5edc8a7c37fa60395a11234..02abef1b32191413a9c28bd1fe234a55bc40eae0 100644 (file)
@@ -28,6 +28,8 @@ void kirkwood_setup_pcie_io_win(int window, u32 base, u32 size,
 void kirkwood_setup_pcie_mem_win(int window, u32 base, u32 size,
                                 int maj, int min);
 
+void kirkwood_pcie_id(u32 *dev, u32 *rev);
+
 void kirkwood_ehci_init(void);
 void kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data);
 void kirkwood_pcie_init(void);
index 5c69992295e88acd485487cb3b7c030de83054a1..eae42406fd86302ed850c88f5094550213e0371c 100644 (file)
 #define  L2_CONFIG_REG         (BRIDGE_VIRT_BASE | 0x0128)
 #define   L2_WRITETHROUGH      0x00000010
 
+/*
+ * Supported devices and revisions.
+ */
+#define MV88F6281_DEV_ID       0x6281
+#define MV88F6281_REV_Z0       0
+#define MV88F6281_REV_A0       2
+
+#define MV88F6192_DEV_ID       0x6192
+#define MV88F6192_REV_Z0       0
+#define MV88F6192_REV_A0       2
+
+#define MV88F6180_DEV_ID       0x6180
+#define MV88F6180_REV_A0       2
+
 /*
  * Register Map
  */
index 2195fa31f6b713cf96cb1160c88b41f2350d19d3..f6b08f207c894189d49bb52fec1de1b2bf65c457 100644 (file)
 
 #define PCIE_BASE      ((void __iomem *)PCIE_VIRT_BASE)
 
+void __init kirkwood_pcie_id(u32 *dev, u32 *rev)
+{
+       *dev = orion_pcie_dev_id(PCIE_BASE);
+       *rev = orion_pcie_rev(PCIE_BASE);
+}
+
 static int pcie_valid_config(int bus, int dev)
 {
        /*