]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - board/freescale/p1_p2_rdb/p1_p2_rdb.c
Merge branch 'sr@denx.de' of git://git.denx.de/u-boot-staging
[karo-tx-uboot.git] / board / freescale / p1_p2_rdb / p1_p2_rdb.c
index 1c4c0200e8a35075747e0d864ae82eaa9defeac4..cfbae69119872fcff406614afb6ed3bd5f8f06e3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2009-2010 Freescale Semiconductor, Inc.
+ * Copyright 2009-2011 Freescale Semiconductor, Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
 #include <asm/mmu.h>
 #include <asm/cache.h>
 #include <asm/immap_85xx.h>
+#include <asm/fsl_serdes.h>
 #include <asm/io.h>
 #include <miiphy.h>
 #include <libfdt.h>
 #include <fdt_support.h>
+#include <fsl_mdio.h>
 #include <tsec.h>
 #include <vsc7385.h>
 #include <netdev.h>
 #include <rtc.h>
+#include <i2c.h>
+#include <hwconfig.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -44,6 +48,7 @@ DECLARE_GLOBAL_DATA_PTR;
 #define RGMII_PHY_RST_SET      0x02000000
 
 #define USB_RST_CLR            0x04000000
+#define USB2_PORT_OUT_EN        0x01000000
 
 #define GPIO_DIR               0x060f0000
 
@@ -53,38 +58,25 @@ DECLARE_GLOBAL_DATA_PTR;
 
 #define SYSCLK_MASK    0x00200000
 #define BOARDREV_MASK  0x10100000
-#define BOARDREV_B     0x10100000
 #define BOARDREV_C     0x00100000
 #define BOARDREV_D     0x00000000
 
 #define SYSCLK_66      66666666
-#define SYSCLK_50      50000000
 #define SYSCLK_100     100000000
 
 unsigned long get_board_sys_clk(ulong dummy)
 {
        volatile ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO_ADDR);
-       u32 val_gpdat, sysclk_gpio, board_rev_gpio;
+       u32 val_gpdat, sysclk_gpio;
 
        val_gpdat = in_be32(&pgpio->gpdat);
        sysclk_gpio = val_gpdat & SYSCLK_MASK;
-       board_rev_gpio = val_gpdat & BOARDREV_MASK;
-       if (board_rev_gpio == BOARDREV_C) {
-               if(sysclk_gpio == 0)
-                       return SYSCLK_66;
-               else
-                       return SYSCLK_100;
-       } else if (board_rev_gpio == BOARDREV_B) {
-               if(sysclk_gpio == 0)
-                       return SYSCLK_66;
-               else
-                       return SYSCLK_50;
-       } else if (board_rev_gpio == BOARDREV_D) {
-               if(sysclk_gpio == 0)
-                       return SYSCLK_66;
-               else
-                       return SYSCLK_100;
-       }
+
+       if(sysclk_gpio == 0)
+               return SYSCLK_66;
+       else
+               return SYSCLK_100;
+
        return 0;
 }
 
@@ -111,8 +103,6 @@ int checkboard (void)
        board_rev_gpio = val_gpdat & BOARDREV_MASK;
        if (board_rev_gpio == BOARDREV_C)
                board_rev = 'C';
-       else if (board_rev_gpio == BOARDREV_B)
-               board_rev = 'B';
        else if (board_rev_gpio == BOARDREV_D)
                board_rev = 'D';
        else
@@ -120,6 +110,9 @@ int checkboard (void)
 
        cpu = gd->cpu;
        printf ("Board: %sRDB Rev%c\n", cpu->name, board_rev);
+#ifdef CONFIG_PHYS_64BIT
+       puts ("(36-bit addrmap) \n");
+#endif
        setbits_be32(&pgpio->gpdir, GPIO_DIR);
 
 /*
@@ -137,10 +130,47 @@ int checkboard (void)
        return 0;
 }
 
+int misc_init_r(void)
+{
+#if defined(CONFIG_SDCARD) || defined(CONFIG_SPIFLASH)
+       ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
+       ccsr_gpio_t *gpio = (void *)CONFIG_SYS_MPC85xx_GPIO_ADDR;
+
+       setbits_be32(&gpio->gpdir, USB2_PORT_OUT_EN);
+       setbits_be32(&gpio->gpdat, USB2_PORT_OUT_EN);
+       setbits_be32(&gur->pmuxcr, MPC85xx_PMUXCR_ELBC_OFF_USB2_ON);
+#endif
+       return 0;
+}
+
 int board_early_init_r(void)
 {
        const unsigned int flashbase = CONFIG_SYS_FLASH_BASE;
        const u8 flash_esel = find_tlb_idx((void *)flashbase, 1);
+       volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
+       unsigned int orig_bus = i2c_get_bus_num();
+       u8 i2c_data;
+
+       i2c_set_bus_num(1);
+       if (i2c_read(CONFIG_SYS_I2C_PCA9557_ADDR, 0,
+               1, &i2c_data, sizeof(i2c_data)) == 0) {
+               if (i2c_data & 0x2)
+                       puts("NOR Flash Bank : Secondary\n");
+               else
+                       puts("NOR Flash Bank : Primary\n");
+
+               if (i2c_data & 0x1) {
+                       setbits_be32(&gur->pmuxcr, MPC85xx_PMUXCR_SD_DATA);
+                       puts("SD/MMC : 8-bit Mode\n");
+                       puts("eSPI : Disabled\n");
+               } else {
+                       puts("SD/MMC : 4-bit Mode\n");
+                       puts("eSPI : Enabled\n");
+               }
+       } else {
+               puts("Failed reading I2C Chip 0x18 on bus 1\n");
+       }
+       i2c_set_bus_num(orig_bus);
 
        /*
         * Remap Boot flash region to caching-inhibited
@@ -165,11 +195,10 @@ int board_early_init_r(void)
 #ifdef CONFIG_TSEC_ENET
 int board_eth_init(bd_t *bis)
 {
+       struct fsl_pq_mdio_info mdio_info;
        struct tsec_info_struct tsec_info[4];
-       volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
        int num = 0;
        char *tmp;
-       u32 pordevsr;
        unsigned int vscfw_addr;
 
 #ifdef CONFIG_TSEC1
@@ -182,9 +211,10 @@ int board_eth_init(bd_t *bis)
 #endif
 #ifdef CONFIG_TSEC3
        SET_STD_TSEC_INFO(tsec_info[num], 3);
-       pordevsr = in_be32(&gur->pordevsr);
-       if (!(pordevsr & MPC85xx_PORDEVSR_SGMII3_DIS))
+       if (is_serdes_configured(SGMII_TSEC3)) {
+               puts("eTSEC3 is in sgmii mode.\n");
                tsec_info[num].flags |= TSEC_SGMII;
+       }
        num++;
 #endif
        if (!num) {
@@ -203,6 +233,10 @@ int board_eth_init(bd_t *bis)
                puts("No address specified for VSC7385 microcode.\n");
 #endif
 
+       mdio_info.regs = (struct tsec_mii_mng *)CONFIG_SYS_MDIO_BASE_ADDR;
+       mdio_info.name = DEFAULT_MII_NAME;
+       fsl_pq_mdio_init(bis, &mdio_info);
+
        tsec_eth_init(bis, tsec_info, num);
 
        return pci_eth_init(bis);
@@ -214,6 +248,8 @@ extern void ft_pci_board_setup(void *blob);
 
 void ft_board_setup(void *blob, bd_t *bd)
 {
+       const char *soc_usb_compat = "fsl-usb2-dr";
+       int err, usb1_off, usb2_off;
        phys_addr_t base;
        phys_size_t size;
 
@@ -222,17 +258,56 @@ void ft_board_setup(void *blob, bd_t *bd)
        base = getenv_bootm_low();
        size = getenv_bootm_size();
 
+#if defined(CONFIG_PCI)
        ft_pci_board_setup(blob);
+#endif /* #if defined(CONFIG_PCI) */
 
        fdt_fixup_memory(blob, (u64)base, (u64)size);
-}
-#endif
 
-#ifdef CONFIG_MP
-extern void cpu_mp_lmb_reserve(struct lmb *lmb);
+#if defined(CONFIG_HAS_FSL_DR_USB)
+       fdt_fixup_dr_usb(blob, bd);
+#endif
 
-void board_lmb_reserve(struct lmb *lmb)
-{
-       cpu_mp_lmb_reserve(lmb);
+#if defined(CONFIG_SDCARD) || defined(CONFIG_SPIFLASH)
+       /* Delete eLBC node as it is muxed with USB2 controller */
+       if (hwconfig("usb2")) {
+               const char *soc_elbc_compat = "fsl,p1020-elbc";
+               int off = fdt_node_offset_by_compatible(blob, -1,
+                       soc_elbc_compat);
+               if (off < 0) {
+                       printf("WARNING: could not find compatible node"
+                               " %s: %s.\n", soc_elbc_compat,
+                               fdt_strerror(off));
+                               return;
+               }
+               err = fdt_del_node(blob, off);
+               if (err < 0) {
+                       printf("WARNING: could not remove %s: %s.\n",
+                               soc_elbc_compat, fdt_strerror(err));
+               }
+               return;
+       }
+#endif
+       /* Delete USB2 node as it is muxed with eLBC */
+       usb1_off = fdt_node_offset_by_compatible(blob, -1,
+               soc_usb_compat);
+       if (usb1_off < 0) {
+               printf("WARNING: could not find compatible node"
+                       " %s: %s.\n", soc_usb_compat,
+                       fdt_strerror(usb1_off));
+               return;
+       }
+       usb2_off = fdt_node_offset_by_compatible(blob, usb1_off,
+                       soc_usb_compat);
+       if (usb2_off < 0) {
+               printf("WARNING: could not find compatible node"
+                       " %s: %s.\n", soc_usb_compat,
+                       fdt_strerror(usb2_off));
+               return;
+       }
+       err = fdt_del_node(blob, usb2_off);
+       if (err < 0)
+               printf("WARNING: could not remove %s: %s.\n",
+                       soc_usb_compat, fdt_strerror(err));
 }
 #endif