TQM85xx: Support for Intel 82527 compatible CAN controller
authorWolfgang Grandegger <wg@grandegger.com>
Thu, 5 Jun 2008 11:12:05 +0000 (13:12 +0200)
committerAndrew Fleming-AFLEMING <afleming@freescale.com>
Wed, 11 Jun 2008 04:59:44 +0000 (23:59 -0500)
This patch adds initialization of the UPMC RAM to support up to two
Intel 82527 compatible CAN controller on the TQM85xx modules.

Signed-off-by: Thomas Waehner <thomas.waehner@tqs.de>
Signed-off-by: Wolfgang Grandegger <wg@grandegger.com>
board/tqc/tqm85xx/law.c
board/tqc/tqm85xx/tlb.c
board/tqc/tqm85xx/tqm85xx.c
include/configs/TQM85xx.h

index d9377005e2c44904302facf77f332ae0af947ab0..ad35464e47c01b1f331a48551a8438928b706199 100644 (file)
@@ -35,6 +35,7 @@
  * 0xc000_0000    0xdfff_ffff     RapidIO                 512M
  * 0xe000_0000    0xe000_ffff     CCSR                    1M
  * 0xe200_0000    0xe2ff_ffff     PCI1 IO                 16M
+ * 0xe300_0000    0xe3ff_ffff     CAN                     16M
  * 0xf800_0000    0xf80f_ffff     BCSR                    1M
  * 0xfe00_0000    0xffff_ffff     FLASH (boot bank)       32M
  *
@@ -49,6 +50,9 @@ struct law_entry law_table[] = {
        SET_LAW_ENTRY (3, CFG_LBC_FLASH_BASE, LAW_SIZE_128M, LAW_TRGT_IF_LBC),
        SET_LAW_ENTRY (4, CFG_PCI1_IO_PHYS, LAW_SIZE_16M, LAW_TRGT_IF_PCI),
        SET_LAW_ENTRY (5, CFG_RIO_MEM_BASE, LAWAR_SIZE_512M, LAW_TRGT_IF_RIO),
+#ifdef CONFIG_CAN_DRIVER
+       SET_LAW_ENTRY (6, CFG_CAN_BASE, LAWAR_SIZE_16M, LAW_TRGT_IF_LBC),
+#endif /* CONFIG_CAN_DRIVER */
 };
 
 int num_law_entries = ARRAY_SIZE (law_table);
index 3e2906236248d937ed75159dd7decbe17b6f8a6e..dc362012d86f9edb1fd5939fabcec3a89c8e278f 100644 (file)
@@ -95,6 +95,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
         * TLB 6:        64M    Non-cacheable, guarded
         * 0xe0000000     1M    CCSRBAR
         * 0xe2000000    16M    PCI1 IO
+        * 0xe3000000    16M    CAN
         */
        SET_TLB_ENTRY (1, CFG_CCSRBAR, CFG_CCSRBAR_PHYS,
                       MAS3_SX | MAS3_SW | MAS3_SR, MAS2_I | MAS2_G,
index a45df2b734f4d87ecf93f08a6676565984b77d31..4fb9c113b29d4ddca4a9d54722805922fbd6bdf2 100644 (file)
@@ -31,6 +31,7 @@
 #include <pci.h>
 #include <asm/processor.h>
 #include <asm/immap_85xx.h>
+#include <asm/io.h>
 #include <ioports.h>
 #include <flash.h>
 
@@ -333,6 +334,27 @@ int misc_init_r (void)
        return 0;
 }
 
+#ifdef CONFIG_CAN_DRIVER
+/*
+ * Initialize UPMC RAM
+ */
+static void upmc_write (u_char addr, uint val)
+{
+       volatile ccsr_lbc_t *lbc = (void *)(CFG_MPC85xx_LBC_ADDR);
+
+       out_be32 (&lbc->mdr, val);
+
+       clrsetbits_be32(&lbc->mcmr, MxMR_MAD_MSK,
+                       MxMR_OP_WARR | (addr & MxMR_MAD_MSK));
+
+       /* dummy access to perform write */
+       out_8 ((void __iomem *)CFG_CAN_BASE, 0);
+
+       /* normal operation */
+       clrbits_be32(&lbc->mcmr, MxMR_OP_WARR);
+}
+#endif /* CONFIG_CAN_DRIVER */
+
 /*
  * Initialize Local Bus
  */
@@ -389,6 +411,41 @@ void local_bus_init (void)
                gur->lbcdllcr = (((temp_lbcdll & 0xff) << 16) | 0x80000000);
                asm ("sync;isync;msync");
        }
+
+#ifdef CONFIG_CAN_DRIVER
+       /*
+        * According to timing specifications EAD must be
+        * set if Local Bus Clock is > 83 MHz.
+        */
+       if (lbc_hz > 83)
+               out_be32 (&lbc->or2, CFG_OR2_CAN | OR_UPM_EAD);
+       else
+               out_be32 (&lbc->or2, CFG_OR2_CAN);
+       out_be32 (&lbc->br2, CFG_BR2_CAN);
+
+       /* LGPL4 is UPWAIT */
+       out_be32(&lbc->mcmr, MxMR_DSx_3_CYCL | MxMR_GPL_x4DIS | MxMR_WLFx_3X);
+
+       /* Initialize UPMC for CAN: single read */
+       upmc_write (0x00, 0xFFFFED00);
+       upmc_write (0x01, 0xCCFFCC00);
+       upmc_write (0x02, 0x00FFCF00);
+       upmc_write (0x03, 0x00FFCF00);
+       upmc_write (0x04, 0x00FFDC00);
+       upmc_write (0x05, 0x00FFCF00);
+       upmc_write (0x06, 0x00FFED00);
+       upmc_write (0x07, 0x3FFFCC07);
+
+       /* Initialize UPMC for CAN: single write */
+       upmc_write (0x18, 0xFFFFED00);
+       upmc_write (0x19, 0xCCFFEC00);
+       upmc_write (0x1A, 0x00FFED80);
+       upmc_write (0x1B, 0x00FFED80);
+       upmc_write (0x1C, 0x00FFFC00);
+       upmc_write (0x1D, 0x0FFFEC00);
+       upmc_write (0x1E, 0x0FFFEF00);
+       upmc_write (0x1F, 0x3FFFEC05);
+#endif /* CONFIG_CAN_DRIVER */
 }
 
 #if defined(CONFIG_PCI)
index 432c155a85f856577b0e5d49392856fda0975e78..17df11856127370a6f961381c754450f7864af9b 100644 (file)
@@ -52,6 +52,8 @@
 
 #define CONFIG_FSL_LAW         1       /* Use common FSL init code     */
 
+#undef CONFIG_CAN_DRIVER               /* CAN Driver support           */
+
 /*
  * sysclk for MPC85xx
  *
 #define        CFG_PROMPT_HUSH_PS2     "> "
 #endif
 
+/* CAN */
+#ifdef CONFIG_CAN_DRIVER
+#define CFG_CAN_BASE           0xE3000000      /* CAN base address     */
+#define CFG_CAN_OR_AM          0xFFFF8000      /* 32 KiB address mask  */
+#define CFG_OR2_CAN            (CFG_CAN_OR_AM | OR_UPM_BI)
+#define CFG_BR2_CAN            ((CFG_CAN_BASE & BR_BA) | \
+                                BR_PS_8 | BR_MS_UPMC | BR_V)
+#endif /* CONFIG_CAN_DRIVER */
+
 /*
  * I2C
  */