OMAP3: Beagle: Add board revision detection
authorDirk Behme <dirk.behme@googlemail.com>
Thu, 12 Feb 2009 17:55:41 +0000 (18:55 +0100)
committerJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Sun, 22 Feb 2009 17:29:10 +0000 (18:29 +0100)
With BeagleBoard revision C some HW changes are introduced (e.g. PinMUX)
which might need different software handling. For this, GPIO pin 171 (GPIO
module 6, offset 11) can be used to check for board revision. If this pin
is low, we have a rev C board. Else it must be a revision Ax or Bx board.

To handle board differences you can call function beagle_get_revision().
E.g.:

if (beagle_get_revision()) {

/* do special revision C stuff here */

}

Signed-off-by: Dirk Behme <dirk.behme@googlemail.com>
board/omap3/beagle/beagle.c
board/omap3/beagle/beagle.h
include/asm-arm/arch-omap3/omap3.h

index ecdea09382a7c3cc42dc7cce31d2c63cdf4eb2ca..7377058f794178a991f4700ed5bea8b378f019ee 100644 (file)
@@ -36,6 +36,8 @@
 #include <asm/mach-types.h>
 #include "beagle.h"
 
+static int beagle_revision_c;
+
 /******************************************************************************
  * Routine: board_init
  * Description: Early hardware init.
@@ -53,6 +55,43 @@ int board_init(void)
        return 0;
 }
 
+/******************************************************************************
+ * Routine: beagle_get_revision
+ * Description: Return revision of the BeagleBoard this code is running on.
+ *              If it is a revision Ax/Bx board, this function returns 0,
+ *              on a revision C board you will get a 1.
+ *****************************************************************************/
+int beagle_get_revision(void)
+{
+       return beagle_revision_c;
+}
+
+/******************************************************************************
+ * Routine: beagle_identify
+ * Description: Detect if we are running on a Beagle revision Ax/Bx or
+ *              Cx. This can be done by GPIO_171. If this is low, we are
+ *              running on a revision C board.
+ *****************************************************************************/
+void beagle_identify(void)
+{
+       gpio_t *gpio6_base = (gpio_t *)OMAP34XX_GPIO6_BASE;
+
+       /* Configure GPIO 171 as input */
+       writel(readl(&gpio6_base->oe) | GPIO11, &gpio6_base->oe);
+
+       /* Get value of GPIO 171 */
+       beagle_revision_c = readl(&gpio6_base->datain) & BOARD_REVISION_MASK;
+
+       printf("Board revision ");
+       if (beagle_revision_c) {
+               printf("Ax/Bx\n");
+               beagle_revision_c = 0;
+       } else {
+               printf("C\n");
+               beagle_revision_c = 1;
+       }
+}
+
 /******************************************************************************
  * Routine: misc_init_r
  * Description: Configure board specific parts
@@ -75,6 +114,8 @@ int misc_init_r(void)
        writel(GPIO31 | GPIO30 | GPIO29 | GPIO28 | GPIO22 | GPIO21 |
                GPIO15 | GPIO14 | GPIO13 | GPIO12, &gpio5_base->setdataout);
 
+       beagle_identify();
+
        return 0;
 }
 
index 6511ffaaa720f5e96e09d1d2a5a6d08419c88a8a..3f2a4dc22d453271b93d2782340fcd92ac20e0b1 100644 (file)
@@ -36,6 +36,8 @@ const omap3_sysinfo sysinfo = {
 #endif
 };
 
+#define BOARD_REVISION_MASK    (0x1 << 11)
+
 /*
  * IEN  - Input Enable
  * IDIS - Input Disable
index 7473656532e36e110d4bfba1777b3b730d9e90d3..0ddbd660ca1d0adfd3760e08f1706be450592e25 100644 (file)
@@ -97,7 +97,8 @@ typedef struct s32ktimer {
 typedef struct gpio {
        unsigned char res1[0x34];
        unsigned int oe;                /* 0x34 */
-       unsigned char res2[0x58];
+       unsigned int datain;            /* 0x38 */
+       unsigned char res2[0x54];
        unsigned int cleardataout;      /* 0x90 */
        unsigned int setdataout;        /* 0x94 */
 } gpio_t;