Merge branch 'master' of git://www.denx.de/git/u-boot-fdt
authorWolfgang Denk <wd@denx.de>
Wed, 11 Jun 2008 20:30:47 +0000 (22:30 +0200)
committerWolfgang Denk <wd@denx.de>
Wed, 11 Jun 2008 20:30:47 +0000 (22:30 +0200)
1  2 
README
board/tqc/tqm8272/tqm8272.c

diff --cc README
Simple merge
index 7bd64012c4ba35a757ad2fe73e190c791b497b34,0000000000000000000000000000000000000000..ec1a37c7f91dc4cf3eb4c5a6ab7340ebd35c9898
mode 100644,000000..100644
--- /dev/null
@@@ -1,1234 -1,0 +1,1230 @@@
- #if CONFIG_OF_FLAT_TREE
- #include <ft_build.h>
- #include <image.h>
- #endif
 +/*
 + * (C) Copyright 2006
 + * Heiko Schocher, DENX Software Engineering, hs@denx.de.
 + *
 + * See file CREDITS for list of people who contributed to this
 + * project.
 + *
 + * This program is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU General Public License as
 + * published by the Free Software Foundation; either version 2 of
 + * the License, or (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.        See the
 + * GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program; if not, write to the Free Software
 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 + * MA 02111-1307 USA
 + */
 +
 +#include <common.h>
 +#include <ioports.h>
 +#include <mpc8260.h>
 +
 +#include <command.h>
 +#ifdef CONFIG_PCI
 +#include <pci.h>
 +#include <asm/m8260_pci.h>
 +#endif
 +
 +#if 0
 +#define deb_printf(fmt,arg...) \
 +      printf ("TQM8272 %s %s: " fmt,__FILE__, __FUNCTION__, ##arg)
 +#else
 +#define deb_printf(fmt,arg...) \
 +      do { } while (0)
 +#endif
 +
 +#if defined(CONFIG_BOARD_GET_CPU_CLK_F)
 +unsigned long board_get_cpu_clk_f (void);
 +#endif
 +
 +/*
 + * I/O Port configuration table
 + *
 + * if conf is 1, then that port pin will be configured at boot time
 + * according to the five values podr/pdir/ppar/psor/pdat for that entry
 + */
 +
 +const iop_conf_t iop_conf_tab[4][32] = {
 +
 +    /* Port A configuration */
 +    { /*            conf ppar psor pdir podr pdat */
 +      /* PA31 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 *ATMTXEN */
 +      /* PA30 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTCA   */
 +      /* PA29 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTSOC  */
 +      /* PA28 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 *ATMRXEN */
 +      /* PA27 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRSOC */
 +      /* PA26 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRCA */
 +      /* PA25 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTXD[0] */
 +      /* PA24 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTXD[1] */
 +      /* PA23 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTXD[2] */
 +      /* PA22 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTXD[3] */
 +      /* PA21 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTXD[4] */
 +      /* PA20 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTXD[5] */
 +      /* PA19 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTXD[6] */
 +      /* PA18 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTXD[7] */
 +      /* PA17 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRXD[7] */
 +      /* PA16 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRXD[6] */
 +      /* PA15 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRXD[5] */
 +      /* PA14 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRXD[4] */
 +      /* PA13 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRXD[3] */
 +      /* PA12 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRXD[2] */
 +      /* PA11 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRXD[1] */
 +      /* PA10 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRXD[0] */
 +      /* PA9  */ {   1,   1,   0,   1,   0,   0   }, /* SMC2 TXD */
 +      /* PA8  */ {   1,   1,   0,   0,   0,   0   }, /* SMC2 RXD */
 +      /* PA7  */ {   0,   0,   0,   1,   0,   0   }, /* PA7 */
 +      /* PA6  */ {   0,   0,   0,   1,   0,   0   }, /* PA6 */
 +      /* PA5  */ {   0,   0,   0,   1,   0,   0   }, /* PA5 */
 +      /* PA4  */ {   0,   0,   0,   1,   0,   0   }, /* PA4 */
 +      /* PA3  */ {   0,   0,   0,   1,   0,   0   }, /* PA3 */
 +      /* PA2  */ {   0,   0,   0,   1,   0,   0   }, /* PA2 */
 +      /* PA1  */ {   0,   0,   0,   1,   0,   0   }, /* PA1 */
 +      /* PA0  */ {   0,   0,   0,   1,   0,   0   }  /* PA0 */
 +    },
 +
 +    /* Port B configuration */
 +    { /*            conf ppar psor pdir podr pdat */
 +      /* PB31 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TX_ER */
 +      /* PB30 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_DV */
 +      /* PB29 */ {   1,   1,   1,   1,   0,   0   }, /* FCC2 MII TX_EN */
 +      /* PB28 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_ER */
 +      /* PB27 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII COL */
 +      /* PB26 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII CRS */
 +      /* PB25 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[3] */
 +      /* PB24 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[2] */
 +      /* PB23 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[1] */
 +      /* PB22 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[0] */
 +      /* PB21 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[0] */
 +      /* PB20 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[1] */
 +      /* PB19 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[2] */
 +      /* PB18 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[3] */
 +      /* PB17 */ {   0,   0,   0,   0,   0,   0   }, /* PB17 */
 +      /* PB16 */ {   0,   0,   0,   0,   0,   0   }, /* PB16 */
 +      /* PB15 */ {   0,   0,   0,   0,   0,   0   }, /* PB15 */
 +      /* PB14 */ {   0,   0,   0,   0,   0,   0   }, /* PB14 */
 +      /* PB13 */ {   0,   0,   0,   0,   0,   0   }, /* PB13 */
 +      /* PB12 */ {   0,   0,   0,   0,   0,   0   }, /* PB12 */
 +      /* PB11 */ {   0,   0,   0,   0,   0,   0   }, /* PB11 */
 +      /* PB10 */ {   0,   0,   0,   0,   0,   0   }, /* PB10 */
 +      /* PB9  */ {   0,   0,   0,   0,   0,   0   }, /* PB9 */
 +      /* PB8  */ {   0,   0,   0,   0,   0,   0   }, /* PB8 */
 +      /* PB7  */ {   0,   0,   0,   0,   0,   0   }, /* PB7 */
 +      /* PB6  */ {   0,   0,   0,   0,   0,   0   }, /* PB6 */
 +      /* PB5  */ {   0,   0,   0,   0,   0,   0   }, /* PB5 */
 +      /* PB4  */ {   0,   0,   0,   0,   0,   0   }, /* PB4 */
 +      /* PB3  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
 +      /* PB2  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
 +      /* PB1  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
 +      /* PB0  */ {   0,   0,   0,   0,   0,   0   }  /* pin doesn't exist */
 +    },
 +
 +    /* Port C */
 +    { /*            conf ppar psor pdir podr pdat */
 +      /* PC31 */ {   0,   0,   0,   1,   0,   0   }, /* PC31 */
 +      /* PC30 */ {   0,   0,   0,   0,   0,   0   }, /* PC30 */
 +      /* PC29 */ {   1,   1,   1,   0,   0,   0   }, /* SCC1 EN *CLSN */
 +      /* PC28 */ {   0,   0,   0,   1,   0,   0   }, /* PC28 */
 +      /* PC27 */ {   0,   0,   0,   1,   0,   0   }, /* PC27 */
 +      /* PC26 */ {   0,   0,   0,   1,   0,   0   }, /* PC26 */
 +      /* PC25 */ {   0,   0,   0,   1,   0,   0   }, /* PC25 */
 +      /* PC24 */ {   0,   0,   0,   1,   0,   0   }, /* PC24 */
 +      /* PC23 */ {   0,   1,   0,   1,   0,   0   }, /* ATMTFCLK */
 +      /* PC22 */ {   0,   1,   0,   0,   0,   0   }, /* ATMRFCLK */
 +      /* PC21 */ {   1,   1,   0,   0,   0,   0   }, /* SCC1 EN RXCLK */
 +      /* PC20 */ {   1,   1,   0,   0,   0,   0   }, /* SCC1 EN TXCLK */
 +      /* PC19 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_CLK */
 +      /* PC18 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII TX_CLK */
 +      /* PC17 */ {   1,   0,   0,   1,   0,   0   }, /* PC17 MDC */
 +      /* PC16 */ {   1,   0,   0,   0,   0,   0   }, /* PC16 MDIO*/
 +      /* PC15 */ {   0,   0,   0,   1,   0,   0   }, /* PC15 */
 +      /* PC14 */ {   1,   1,   0,   0,   0,   0   }, /* SCC1 EN *CD */
 +      /* PC13 */ {   0,   0,   0,   1,   0,   0   }, /* PC13 */
 +      /* PC12 */ {   0,   0,   0,   1,   0,   0   }, /* PC12 */
 +      /* PC11 */ {   0,   0,   0,   1,   0,   0   }, /* PC11 */
 +      /* PC10 */ {   0,   0,   0,   1,   0,   0   }, /* PC10 */
 +      /* PC9  */ {   0,   0,   0,   1,   0,   0   }, /* PC9 */
 +      /* PC8  */ {   0,   0,   0,   1,   0,   0   }, /* PC8 */
 +      /* PC7  */ {   0,   0,   0,   1,   0,   0   }, /* PC7 */
 +      /* PC6  */ {   0,   0,   0,   1,   0,   0   }, /* PC6 */
 +      /* PC5  */ {   1,   1,   0,   1,   0,   0   }, /* PC5 SMC1 TXD */
 +      /* PC4  */ {   1,   1,   0,   0,   0,   0   }, /* PC4 SMC1 RXD */
 +      /* PC3  */ {   0,   0,   0,   1,   0,   0   }, /* PC3 */
 +      /* PC2  */ {   0,   0,   0,   1,   0,   1   }, /* ENET FDE */
 +      /* PC1  */ {   0,   0,   0,   1,   0,   0   }, /* ENET DSQE */
 +      /* PC0  */ {   0,   0,   0,   1,   0,   0   }, /* ENET LBK */
 +    },
 +
 +    /* Port D */
 +    { /*            conf ppar psor pdir podr pdat */
 +      /* PD31 */ {   1,   1,   0,   0,   0,   0   }, /* SCC1 EN RxD */
 +      /* PD30 */ {   1,   1,   1,   1,   0,   0   }, /* SCC1 EN TxD */
 +      /* PD29 */ {   1,   1,   0,   1,   0,   0   }, /* SCC1 EN TENA */
 +      /* PD28 */ {   0,   0,   0,   1,   0,   0   }, /* PD28 */
 +      /* PD27 */ {   0,   0,   0,   1,   0,   0   }, /* PD27 */
 +      /* PD26 */ {   0,   0,   0,   1,   0,   0   }, /* PD26 */
 +      /* PD25 */ {   0,   0,   0,   1,   0,   0   }, /* PD25 */
 +      /* PD24 */ {   0,   0,   0,   1,   0,   0   }, /* PD24 */
 +      /* PD23 */ {   0,   0,   0,   1,   0,   0   }, /* PD23 */
 +      /* PD22 */ {   0,   0,   0,   1,   0,   0   }, /* PD22 */
 +      /* PD21 */ {   0,   0,   0,   1,   0,   0   }, /* PD21 */
 +      /* PD20 */ {   0,   0,   0,   1,   0,   0   }, /* PD20 */
 +      /* PD19 */ {   0,   0,   0,   1,   0,   0   }, /* PD19 */
 +      /* PD18 */ {   0,   0,   0,   1,   0,   0   }, /* PD19 */
 +      /* PD17 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXPRTY */
 +      /* PD16 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXPRTY */
 +#if defined(CONFIG_SOFT_I2C)
 +      /* PD15 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SDA */
 +      /* PD14 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SCL */
 +#else
 +#if defined(CONFIG_HARD_I2C)
 +      /* PD15 */ {   1,   1,   1,   0,   1,   0   }, /* I2C SDA */
 +      /* PD14 */ {   1,   1,   1,   0,   1,   0   }, /* I2C SCL */
 +#else /* normal I/O port pins */
 +      /* PD15 */ {   0,   1,   1,   0,   1,   0   }, /* I2C SDA */
 +      /* PD14 */ {   0,   1,   1,   0,   1,   0   }, /* I2C SCL */
 +#endif
 +#endif
 +      /* PD13 */ {   0,   0,   0,   0,   0,   0   }, /* PD13 */
 +      /* PD12 */ {   0,   0,   0,   0,   0,   0   }, /* PD12 */
 +      /* PD11 */ {   0,   0,   0,   0,   0,   0   }, /* PD11 */
 +      /* PD10 */ {   0,   0,   0,   0,   0,   0   }, /* PD10 */
 +      /* PD9  */ {   1,   1,   0,   1,   0,   0   }, /* SMC1 TXD */
 +      /* PD8  */ {   1,   1,   0,   0,   0,   0   }, /* SMC1 RXD */
 +      /* PD7  */ {   0,   0,   0,   1,   0,   1   }, /* PD7 */
 +      /* PD6  */ {   0,   0,   0,   1,   0,   1   }, /* PD6 */
 +      /* PD5  */ {   0,   0,   0,   1,   0,   0   }, /* PD5 */
 +      /* PD4  */ {   0,   0,   0,   1,   0,   1   }, /* PD4 */
 +      /* PD3  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
 +      /* PD2  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
 +      /* PD1  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
 +      /* PD0  */ {   0,   0,   0,   0,   0,   0   }  /* pin doesn't exist */
 +    }
 +};
 +
 +#define _NOT_USED_    0xFFFFFFFF
 +
 +/* UPM pattern for bus clock = 66.7 MHz */
 +static const uint upmTable67[] =
 +{
 +    /* Offset UPM Read Single RAM array entry -> NAND Read Data */
 +    /* 0x00 */        0x0fa3f100, 0x0fa3b000, 0x0fa33100, 0x0fa33000,
 +    /* 0x04 */        0x0fa33000, 0x0fa33004, 0xfffffc01, 0xfffffc00,
 +
 +              /* UPM Read Burst RAM array entry -> unused */
 +    /* 0x08 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x0C */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +
 +              /* UPM Read Burst RAM array entry -> unused */
 +    /* 0x10 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x14 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +
 +              /* UPM Write Single RAM array entry -> NAND Write Data, ADDR and CMD */
 +    /* 0x18 */        0x00a3fc00, 0x00a3fc00, 0x00a3fc00, 0x00a3fc00,
 +    /* 0x1C */        0x0fa3fc00, 0x0fa3fc04, 0xfffffc01, 0xfffffc00,
 +
 +              /* UPM Write Burst RAM array entry -> unused */
 +    /* 0x20 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x24 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x28 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x2C */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
 +
 +              /* UPM Refresh Timer RAM array entry -> unused */
 +    /* 0x30 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x34 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x38 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
 +
 +              /* UPM Exception RAM array entry -> unsused */
 +    /* 0x3C */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
 +};
 +
 +/* UPM pattern for bus clock = 100 MHz */
 +static const uint upmTable100[] =
 +{
 +    /* Offset UPM Read Single RAM array entry -> NAND Read Data */
 +    /* 0x00 */        0x0fa3f200, 0x0fa3b000, 0x0fa33300, 0x0fa33000,
 +    /* 0x04 */        0x0fa33000, 0x0fa33004, 0xfffffc01, 0xfffffc00,
 +
 +              /* UPM Read Burst RAM array entry -> unused */
 +    /* 0x08 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x0C */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +
 +              /* UPM Read Burst RAM array entry -> unused */
 +    /* 0x10 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x14 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +
 +              /* UPM Write Single RAM array entry -> NAND Write Data, ADDR and CMD */
 +    /* 0x18 */        0x00a3ff00, 0x00a3fc00, 0x00a3fc00, 0x0fa3fc00,
 +    /* 0x1C */        0x0fa3fc00, 0x0fa3fc04, 0xfffffc01, 0xfffffc00,
 +
 +              /* UPM Write Burst RAM array entry -> unused */
 +    /* 0x20 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x24 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x28 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x2C */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
 +
 +              /* UPM Refresh Timer RAM array entry -> unused */
 +    /* 0x30 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x34 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x38 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
 +
 +              /* UPM Exception RAM array entry -> unsused */
 +    /* 0x3C */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
 +};
 +
 +/* UPM pattern for bus clock = 133.3 MHz */
 +static const uint upmTable133[] =
 +{
 +    /* Offset UPM Read Single RAM array entry -> NAND Read Data */
 +    /* 0x00 */        0x0fa3f300, 0x0fa3b000, 0x0fa33300, 0x0fa33000,
 +    /* 0x04 */        0x0fa33200, 0x0fa33004, 0xfffffc01, 0xfffffc00,
 +
 +              /* UPM Read Burst RAM array entry -> unused */
 +    /* 0x08 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x0C */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +
 +              /* UPM Read Burst RAM array entry -> unused */
 +    /* 0x10 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x14 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +
 +              /* UPM Write Single RAM array entry -> NAND Write Data, ADDR and CMD */
 +    /* 0x18 */        0x00a3ff00, 0x00a3fc00, 0x00a3fd00, 0x0fa3fc00,
 +    /* 0x1C */        0x0fa3fd00, 0x0fa3fc04, 0xfffffc01, 0xfffffc00,
 +
 +              /* UPM Write Burst RAM array entry -> unused */
 +    /* 0x20 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x24 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x28 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x2C */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
 +
 +              /* UPM Refresh Timer RAM array entry -> unused */
 +    /* 0x30 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x34 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x38 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
 +
 +              /* UPM Exception RAM array entry -> unsused */
 +    /* 0x3C */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
 +};
 +
 +static int    chipsel = 0;
 +
 +/* UPM pattern for slow init */
 +static const uint upmTableSlow[] =
 +{
 +    /* Offset UPM Read Single RAM array entry */
 +    /* 0x00 */        0xffffee00, 0x00ffcc80, 0x00ffcf00, 0x00ffdc00,
 +    /* 0x04 */        0x00ffce80, 0x00ffcc00, 0x00ffee00, 0x3fffcc07,
 +
 +              /* UPM Read Burst RAM array entry -> unused */
 +    /* 0x08 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x0C */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +
 +              /* UPM Read Burst RAM array entry -> unused */
 +    /* 0x10 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x14 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +
 +              /* UPM Write Single RAM array entry */
 +    /* 0x18 */        0xffffee00, 0x00ffec80, 0x00ffef00, 0x00fffc80,
 +    /* 0x1C */        0x00fffe00, 0x00ffec00, 0x0fffef00, 0x3fffec05,
 +
 +              /* UPM Write Burst RAM array entry -> unused */
 +    /* 0x20 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x24 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x28 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x2C */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
 +
 +              /* UPM Refresh Timer RAM array entry -> unused */
 +    /* 0x30 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x34 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x38 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
 +
 +              /* UPM Exception RAM array entry -> unused */
 +    /* 0x3C */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
 +};
 +
 +/* UPM pattern for fast init */
 +static const uint upmTableFast[] =
 +{
 +    /* Offset UPM Read Single RAM array entry */
 +    /* 0x00 */        0xffffee00, 0x00ffcc80, 0x00ffcd80, 0x00ffdc00,
 +    /* 0x04 */        0x00ffdc00, 0x00ffcf00, 0x00ffec00, 0x3fffcc07,
 +
 +              /* UPM Read Burst RAM array entry -> unused */
 +    /* 0x08 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x0C */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +
 +              /* UPM Read Burst RAM array entry -> unused */
 +    /* 0x10 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x14 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +
 +              /* UPM Write Single RAM array entry */
 +    /* 0x18 */        0xffffee00, 0x00ffec80, 0x00ffee80, 0x00fffc00,
 +    /* 0x1C */        0x00fffc00, 0x00ffec00, 0x0fffef00, 0x3fffec05,
 +
 +              /* UPM Write Burst RAM array entry -> unused */
 +    /* 0x20 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x24 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x28 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x2C */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
 +
 +              /* UPM Refresh Timer RAM array entry -> unused */
 +    /* 0x30 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x34 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
 +    /* 0x38 */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
 +
 +              /* UPM Exception RAM array entry -> unused */
 +    /* 0x3C */        0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
 +};
 +
 +
 +/* ------------------------------------------------------------------------- */
 +
 +/* Check Board Identity:
 + */
 +int checkboard (void)
 +{
 +      char *p = (char *) HWIB_INFO_START_ADDR;
 +
 +      puts ("Board: ");
 +      if (*((unsigned long *)p) == (unsigned long)CFG_HWINFO_MAGIC) {
 +              puts (p);
 +      } else {
 +              puts ("No HWIB assuming TQM8272");
 +      }
 +      putc ('\n');
 +
 +      return 0;
 +}
 +
 +/* ------------------------------------------------------------------------- */
 +#if defined(CONFIG_BOARD_GET_CPU_CLK_F)
 +static int get_cas_latency (void)
 +{
 +      /* get it from the option -ts in CIB */
 +      /* default is 3 */
 +      int     ret = 3;
 +      int     pos = 0;
 +      char    *p = (char *) CIB_INFO_START_ADDR;
 +
 +      while ((*p != '\0') && (pos < CIB_INFO_LEN)) {
 +              if (*p < ' ' || *p > '~') { /* ASCII strings! */
 +                      return ret;
 +              }
 +              if (*p == '-') {
 +                      if ((p[1] == 't') && (p[2] == 's')) {
 +                              return (p[4] - '0');
 +                      }
 +              }
 +              p++;
 +              pos++;
 +      }
 +      return ret;
 +}
 +#endif
 +
 +static ulong set_sdram_timing (volatile uint *sdmr_ptr, ulong sdmr, int col)
 +{
 +#if defined(CONFIG_BOARD_GET_CPU_CLK_F)
 +      int     clk = board_get_cpu_clk_f ();
 +      volatile immap_t *immr = (immap_t *)CFG_IMMR;
 +      int     busmode = (immr->im_siu_conf.sc_bcr & BCR_EBM ? 1 : 0);
 +      int     cas;
 +
 +      sdmr = sdmr & ~(PSDMR_RFRC_MSK | PSDMR_PRETOACT_MSK | PSDMR_WRC_MSK | \
 +                       PSDMR_BUFCMD);
 +      if (busmode) {
 +              switch (clk) {
 +                      case 66666666:
 +                              sdmr |= (PSDMR_RFRC_66MHZ_60X | \
 +                                      PSDMR_PRETOACT_66MHZ_60X | \
 +                                      PSDMR_WRC_66MHZ_60X | \
 +                                      PSDMR_BUFCMD_66MHZ_60X);
 +                              break;
 +                      case 100000000:
 +                              sdmr |= (PSDMR_RFRC_100MHZ_60X | \
 +                                      PSDMR_PRETOACT_100MHZ_60X | \
 +                                      PSDMR_WRC_100MHZ_60X | \
 +                                      PSDMR_BUFCMD_100MHZ_60X);
 +                              break;
 +
 +              }
 +      } else {
 +              switch (clk) {
 +                      case 66666666:
 +                              sdmr |= (PSDMR_RFRC_66MHZ_SINGLE | \
 +                                      PSDMR_PRETOACT_66MHZ_SINGLE | \
 +                                      PSDMR_WRC_66MHZ_SINGLE | \
 +                                      PSDMR_BUFCMD_66MHZ_SINGLE);
 +                              break;
 +                      case 100000000:
 +                              sdmr |= (PSDMR_RFRC_100MHZ_SINGLE | \
 +                                      PSDMR_PRETOACT_100MHZ_SINGLE | \
 +                                      PSDMR_WRC_100MHZ_SINGLE | \
 +                                      PSDMR_BUFCMD_100MHZ_SINGLE);
 +                              break;
 +                      case 133333333:
 +                              sdmr |= (PSDMR_RFRC_133MHZ_SINGLE | \
 +                                      PSDMR_PRETOACT_133MHZ_SINGLE | \
 +                                      PSDMR_WRC_133MHZ_SINGLE | \
 +                                      PSDMR_BUFCMD_133MHZ_SINGLE);
 +                              break;
 +              }
 +      }
 +      cas = get_cas_latency();
 +      sdmr &=~ (PSDMR_CL_MSK | PSDMR_LDOTOPRE_MSK);
 +      sdmr |= cas;
 +      sdmr |= ((cas - 1) << 6);
 +      return sdmr;
 +#else
 +      return sdmr;
 +#endif
 +}
 +
 +/* Try SDRAM initialization with P/LSDMR=sdmr and ORx=orx
 + *
 + * This routine performs standard 8260 initialization sequence
 + * and calculates the available memory size. It may be called
 + * several times to try different SDRAM configurations on both
 + * 60x and local buses.
 + */
 +static long int try_init (volatile memctl8260_t * memctl, ulong sdmr,
 +                                                ulong orx, volatile uchar * base, int col)
 +{
 +      volatile uchar c = 0xff;
 +      volatile uint *sdmr_ptr;
 +      volatile uint *orx_ptr;
 +      ulong maxsize, size;
 +      int i;
 +
 +      /* We must be able to test a location outsize the maximum legal size
 +       * to find out THAT we are outside; but this address still has to be
 +       * mapped by the controller. That means, that the initial mapping has
 +       * to be (at least) twice as large as the maximum expected size.
 +       */
 +      maxsize = (1 + (~orx | 0x7fff)) / 2;
 +
 +      /* Since CFG_SDRAM_BASE is always 0 (??), we assume that
 +       * we are configuring CS1 if base != 0
 +       */
 +      sdmr_ptr = base ? &memctl->memc_lsdmr : &memctl->memc_psdmr;
 +      orx_ptr = base ? &memctl->memc_or2 : &memctl->memc_or1;
 +
 +      *orx_ptr = orx;
 +      sdmr = set_sdram_timing (sdmr_ptr, sdmr, col);
 +      /*
 +       * Quote from 8260 UM (10.4.2 SDRAM Power-On Initialization, 10-35):
 +       *
 +       * "At system reset, initialization software must set up the
 +       *  programmable parameters in the memory controller banks registers
 +       *  (ORx, BRx, P/LSDMR). After all memory parameters are configured,
 +       *  system software should execute the following initialization sequence
 +       *  for each SDRAM device.
 +       *
 +       *  1. Issue a PRECHARGE-ALL-BANKS command
 +       *  2. Issue eight CBR REFRESH commands
 +       *  3. Issue a MODE-SET command to initialize the mode register
 +       *
 +       *  The initial commands are executed by setting P/LSDMR[OP] and
 +       *  accessing the SDRAM with a single-byte transaction."
 +       *
 +       * The appropriate BRx/ORx registers have already been set when we
 +       * get here. The SDRAM can be accessed at the address CFG_SDRAM_BASE.
 +       */
 +
 +      *sdmr_ptr = sdmr | PSDMR_OP_PREA;
 +      *base = c;
 +
 +      *sdmr_ptr = sdmr | PSDMR_OP_CBRR;
 +      for (i = 0; i < 8; i++)
 +              *base = c;
 +
 +      *sdmr_ptr = sdmr | PSDMR_OP_MRW;
 +      *(base + CFG_MRS_OFFS) = c;     /* setting MR on address lines */
 +
 +      *sdmr_ptr = sdmr | PSDMR_OP_NORM | PSDMR_RFEN;
 +      *base = c;
 +
 +      size = get_ram_size((long *)base, maxsize);
 +      *orx_ptr = orx | ~(size - 1);
 +
 +      return (size);
 +}
 +
 +long int initdram (int board_type)
 +{
 +      volatile immap_t *immap = (immap_t *) CFG_IMMR;
 +      volatile memctl8260_t *memctl = &immap->im_memctl;
 +
 +#ifndef CFG_RAMBOOT
 +      long size8, size9;
 +#endif
 +      long psize, lsize;
 +
 +      psize = 16 * 1024 * 1024;
 +      lsize = 0;
 +
 +      memctl->memc_psrt = CFG_PSRT;
 +      memctl->memc_mptpr = CFG_MPTPR;
 +
 +#ifndef CFG_RAMBOOT
 +      /* 60x SDRAM setup:
 +       */
 +      size8 = try_init (memctl, CFG_PSDMR_8COL, CFG_OR1_8COL,
 +                                        (uchar *) CFG_SDRAM_BASE, 8);
 +      size9 = try_init (memctl, CFG_PSDMR_9COL, CFG_OR1_9COL,
 +                                        (uchar *) CFG_SDRAM_BASE, 9);
 +
 +      if (size8 < size9) {
 +              psize = size9;
 +              printf ("(60x:9COL - %ld MB, ", psize >> 20);
 +      } else {
 +              psize = try_init (memctl, CFG_PSDMR_8COL, CFG_OR1_8COL,
 +                                                (uchar *) CFG_SDRAM_BASE, 8);
 +              printf ("(60x:8COL - %ld MB, ", psize >> 20);
 +      }
 +
 +#endif /* CFG_RAMBOOT */
 +
 +      icache_enable ();
 +
 +      return (psize);
 +}
 +
 +
 +static inline int scanChar (char *p, int len, unsigned long *number)
 +{
 +      int     akt = 0;
 +
 +      *number = 0;
 +      while (akt < len) {
 +              if ((*p >= '0') && (*p <= '9')) {
 +                      *number *= 10;
 +                      *number += *p - '0';
 +                      p += 1;
 +              } else {
 +                      if (*p == '-')  return akt;
 +                      return -1;
 +              }
 +              akt ++;
 +      }
 +      return akt;
 +}
 +
 +typedef struct{
 +      int     Bus;
 +      int     flash;
 +      int     flash_nr;
 +      int     ram;
 +      int     ram_cs;
 +      int     nand;
 +      int     nand_cs;
 +      int     eeprom;
 +      int     can;
 +      unsigned long   cpunr;
 +      unsigned long   option;
 +      int     SecEng;
 +      int     cpucl;
 +      int     cpmcl;
 +      int     buscl;
 +      int     busclk_real_ok;
 +      int     busclk_real;
 +      unsigned char   OK;
 +      unsigned char  ethaddr[20];
 +} HWIB_INFO;
 +
 +HWIB_INFO     hwinf = {0, 0, 1, 0, 1, 0, 0, 0, 0, 8272, 0 ,0,
 +                       0, 0, 0, 0, 0, 0};
 +
 +static int dump_hwib(void)
 +{
 +      HWIB_INFO       *hw = &hwinf;
 +      volatile immap_t *immr = (immap_t *)CFG_IMMR;
 +      char *s = getenv("serial#");
 +
 +      if (hw->OK) {
 +              printf ("HWIB on %x\n", HWIB_INFO_START_ADDR);
 +              printf ("serial : %s\n", s);
 +              printf ("ethaddr: %s\n", hw->ethaddr);
 +              printf ("FLASH  : %x nr:%d\n", hw->flash, hw->flash_nr);
 +              printf ("RAM    : %x cs:%d\n", hw->ram, hw->ram_cs);
 +              printf ("CPU    : %d\n", hw->cpunr);
 +              printf ("CAN    : %d\n", hw->can);
 +              if (hw->eeprom) printf ("EEprom : %x\n", hw->eeprom);
 +              else printf ("No EEprom\n");
 +              if (hw->nand) {
 +                      printf ("NAND   : %x\n", hw->nand);
 +                      printf ("NAND CS: %d\n", hw->nand_cs);
 +              } else { printf ("No NAND\n");}
 +              printf ("Bus %s mode.\n", (hw->Bus ? "60x" : "Single PQII"));
 +              printf ("  real : %s\n", (immr->im_siu_conf.sc_bcr & BCR_EBM ? \
 +                               "60x" : "Single PQII"));
 +              printf ("Option : %x\n", hw->option);
 +              printf ("%s Security Engine\n", (hw->SecEng ? "with" : "no"));
 +              printf ("CPM Clk: %d\n", hw->cpmcl);
 +              printf ("CPU Clk: %d\n", hw->cpucl);
 +              printf ("Bus Clk: %d\n", hw->buscl);
 +              if (hw->busclk_real_ok) {
 +                      printf ("  real Clk: %d\n", hw->busclk_real);
 +              }
 +              printf ("CAS    : %d\n", get_cas_latency());
 +      } else {
 +              printf("HWIB @%x not OK\n", HWIB_INFO_START_ADDR);
 +      }
 +      return 0;
 +}
 +
 +static inline int search_real_busclk (int *clk)
 +{
 +      int     part = 0, pos = 0;
 +      char *p = (char *) CIB_INFO_START_ADDR;
 +      int     ok = 0;
 +
 +      while ((*p != '\0') && (pos < CIB_INFO_LEN)) {
 +              if (*p < ' ' || *p > '~') { /* ASCII strings! */
 +                      return 0;
 +              }
 +              switch (part) {
 +              default:
 +                      if (*p == '-') {
 +                              ++part;
 +                      }
 +                      break;
 +              case 3:
 +                      if (*p == '-') {
 +                              ++part;
 +                              break;
 +                      }
 +                      if (*p == 'b') {
 +                              ok = 1;
 +                              p++;
 +                              break;
 +                      }
 +                      if (ok) {
 +                              switch (*p) {
 +                              case '6':
 +                                      *clk = 66666666;
 +                                      return 1;
 +                                      break;
 +                              case '1':
 +                                      if (p[1] == '3') {
 +                                              *clk = 133333333;
 +                                      } else {
 +                                              *clk = 100000000;
 +                                      }
 +                                      return 1;
 +                                      break;
 +                              }
 +                      }
 +                      break;
 +              }
 +              p++;
 +      }
 +      return 0;
 +}
 +
 +int analyse_hwib (void)
 +{
 +      char    *p = (char *) HWIB_INFO_START_ADDR;
 +      int     anz;
 +      int     part = 1, i = 0, pos = 0;
 +      HWIB_INFO       *hw = &hwinf;
 +
 +      deb_printf(" %s pointer: %p\n", __FUNCTION__, p);
 +      /* Head = TQM */
 +      if (*((unsigned long *)p) != (unsigned long)CFG_HWINFO_MAGIC) {
 +              deb_printf("No HWIB\n");
 +              return -1;
 +      }
 +      p += 3;
 +      if (scanChar (p, 4, &hw->cpunr) < 0) {
 +              deb_printf("No CPU\n");
 +              return -2;
 +      }
 +      p +=4;
 +
 +      hw->flash = 0x200000 << (*p - 'A');
 +      p++;
 +      hw->flash_nr = *p - '0';
 +      p++;
 +
 +      hw->ram = 0x2000000 << (*p - 'A');
 +      p++;
 +      if (*p == '2') {
 +              hw->ram_cs = 2;
 +              p++;
 +      }
 +
 +      if (*p == 'A') hw->can = 1;
 +      if (*p == 'B') hw->can = 2;
 +      p +=1;
 +      p +=1;  /* connector */
 +      if (*p != '0') {
 +              hw->eeprom = 0x1000 << (*p - 'A');
 +      }
 +      p++;
 +
 +      if ((*p < '0') || (*p > '9')) {
 +              /* NAND before z-option */
 +              hw->nand = 0x8000000 << (*p - 'A');
 +              p++;
 +              hw->nand_cs = *p - '0';
 +              p += 2;
 +      }
 +      /* z-option */
 +      anz = scanChar (p, 4, &hw->option);
 +      if (anz < 0) {
 +              deb_printf("No option\n");
 +              return -3;
 +      }
 +      if (hw->option & 0x8) hw->Bus = 1;
 +      p += anz;
 +      if (*p != '-') {
 +              deb_printf("No -\n");
 +              return -4;
 +      }
 +      p++;
 +      /* C option */
 +      if (*p == 'E') {
 +              hw->SecEng = 1;
 +              p++;
 +      }
 +      switch (*p) {
 +              case 'M': hw->cpucl = 266666666;
 +                      break;
 +              case 'P': hw->cpucl = 300000000;
 +                      break;
 +              case 'T': hw->cpucl = 400000000;
 +                      break;
 +              default:
 +                      deb_printf("No CPU Clk: %c\n", *p);
 +                      return -5;
 +                      break;
 +      }
 +      p++;
 +      switch (*p) {
 +              case 'I': hw->cpmcl = 200000000;
 +                      break;
 +              case 'M': hw->cpmcl = 300000000;
 +                      break;
 +              default:
 +                      deb_printf("No CPM Clk\n");
 +                      return -6;
 +                      break;
 +      }
 +      p++;
 +      switch (*p) {
 +              case 'B': hw->buscl = 66666666;
 +                      break;
 +              case 'E': hw->buscl = 100000000;
 +                      break;
 +              case 'F': hw->buscl = 133333333;
 +                      break;
 +              default:
 +                      deb_printf("No BUS Clk\n");
 +                      return -7;
 +                      break;
 +      }
 +      p++;
 +
 +      hw->OK = 1;
 +      /* search MAC Address */
 +      while ((*p != '\0') && (pos < CFG_HWINFO_SIZE)) {
 +              if (*p < ' ' || *p > '~') { /* ASCII strings! */
 +                      return 0;
 +              }
 +              switch (part) {
 +              default:
 +                      if (*p == ' ') {
 +                              ++part;
 +                              i = 0;
 +                      }
 +                      break;
 +              case 3:                 /* Copy MAC address */
 +                      if (*p == ' ') {
 +                              ++part;
 +                              i = 0;
 +                              break;
 +                      }
 +                      hw->ethaddr[i++] = *p;
 +                      if ((i % 3) == 2)
 +                              hw->ethaddr[i++] = ':';
 +                      break;
 +
 +              }
 +              p++;
 +      }
 +
 +      hw->busclk_real_ok = search_real_busclk (&hw->busclk_real);
 +      return 0;
 +}
 +
 +#if defined(CONFIG_GET_CPU_STR_F)
 +/* !! This routine runs from Flash */
 +char get_cpu_str_f (char *buf)
 +{
 +      char *p = (char *) HWIB_INFO_START_ADDR;
 +      int     i = 0;
 +
 +      buf[i++] = 'M';
 +      buf[i++] = 'P';
 +      buf[i++] = 'C';
 +      if (*((unsigned long *)p) == (unsigned long)CFG_HWINFO_MAGIC) {
 +              buf[i++] = *&p[3];
 +              buf[i++] = *&p[4];
 +              buf[i++] = *&p[5];
 +              buf[i++] = *&p[6];
 +      } else {
 +              buf[i++] = '8';
 +              buf[i++] = '2';
 +              buf[i++] = '7';
 +              buf[i++] = 'x';
 +      }
 +      buf[i++] = 0;
 +      return 0;
 +}
 +#endif
 +
 +#if defined(CONFIG_BOARD_GET_CPU_CLK_F)
 +/* !! This routine runs from Flash */
 +unsigned long board_get_cpu_clk_f (void)
 +{
 +      char *p = (char *) HWIB_INFO_START_ADDR;
 +      int i = 0;
 +
 +      if (*((unsigned long *)p) == (unsigned long)CFG_HWINFO_MAGIC) {
 +              if (search_real_busclk (&i))
 +                      return i;
 +      }
 +      return CONFIG_8260_CLKIN;
 +}
 +#endif
 +
 +#if CONFIG_BOARD_EARLY_INIT_R
 +
 +static int can_test (unsigned long off)
 +{
 +      volatile unsigned char  *base   = (unsigned char *) (CFG_CAN_BASE + off);
 +
 +      *(base + 0x17) = 'T';
 +      *(base + 0x18) = 'Q';
 +      *(base + 0x19) = 'M';
 +      if ((*(base + 0x17) != 'T') ||
 +          (*(base + 0x18) != 'Q') ||
 +          (*(base + 0x19) != 'M')) {
 +              return 0;
 +      }
 +      return 1;
 +}
 +
 +static int can_config_one (unsigned long off)
 +{
 +      volatile unsigned char  *ctrl   = (unsigned char *) (CFG_CAN_BASE + off);
 +      volatile unsigned char  *cpu_if = (unsigned char *) (CFG_CAN_BASE + off + 0x02);
 +      volatile unsigned char  *clkout = (unsigned char *) (CFG_CAN_BASE + off + 0x1f);
 +      unsigned char temp;
 +
 +      *cpu_if = 0x45;
 +      temp = *ctrl;
 +      temp |= 0x40;
 +      *ctrl   = temp;
 +      *clkout = 0x20;
 +      temp = *ctrl;
 +      temp &= ~0x40;
 +      *ctrl   = temp;
 +      return 0;
 +}
 +
 +static int can_config (void)
 +{
 +      int     ret = 0;
 +      can_config_one (0);
 +      if (hwinf.can == 2) {
 +              can_config_one (0x100);
 +      }
 +      /* make Test if they really there */
 +      ret += can_test (0);
 +      ret += can_test (0x100);
 +      return ret;
 +}
 +
 +static int init_can (void)
 +{
 +      volatile immap_t * immr = (immap_t *)CFG_IMMR;
 +      volatile memctl8260_t *memctl = &immr->im_memctl;
 +      int     count = 0;
 +
 +      if ((hwinf.OK) && (hwinf.can)) {
 +              memctl->memc_or4 = CFG_CAN_OR;
 +              memctl->memc_br4 = CFG_CAN_BR;
 +              /* upm Init */
 +              upmconfig (UPMC, (uint *) upmTableFast,
 +                         sizeof (upmTableFast) / sizeof (uint));
 +              memctl->memc_mcmr =     (MxMR_DSx_3_CYCL |
 +                                      MxMR_GPL_x4DIS |
 +                                      MxMR_RLFx_2X |
 +                                      MxMR_WLFx_2X |
 +                                      MxMR_OP_NORM);
 +              /* can configure */
 +              count = can_config ();
 +              printf ("CAN:   %d @ %x\n", count, CFG_CAN_BASE);
 +              if (hwinf.can != count) printf("!!! difference to HWIB\n");
 +      } else {
 +              printf ("CAN:   No\n");
 +      }
 +      return 0;
 +}
 +
 +int board_early_init_r(void)
 +{
 +      analyse_hwib ();
 +      init_can ();
 +      return 0;
 +}
 +#endif
 +
 +int do_hwib_dump (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 +{
 +      dump_hwib ();
 +      return 0;
 +}
 +
 +U_BOOT_CMD(
 +        hwib, 1,      1,      do_hwib_dump,
 +        "hwib    - dump HWIB'\n",
 +        "\n"
 +);
 +
 +#ifdef CFG_UPDATE_FLASH_SIZE
 +static int get_flash_timing (void)
 +{
 +      /* get it from the option -tf in CIB */
 +      /* default is 0x00000c84 */
 +      int     ret = 0x00000c84;
 +      int     pos = 0;
 +      int     nr = 0;
 +      char    *p = (char *) CIB_INFO_START_ADDR;
 +
 +      while ((*p != '\0') && (pos < CIB_INFO_LEN)) {
 +              if (*p < ' ' || *p > '~') { /* ASCII strings! */
 +                      return ret;
 +              }
 +              if (*p == '-') {
 +                      if ((p[1] == 't') && (p[2] == 'f')) {
 +                              p += 6;
 +                              ret = 0;
 +                              while (nr < 8) {
 +                              if ((*p >= '0') && (*p <= '9')) {
 +                                      ret *= 0x10;
 +                                      ret += *p - '0';
 +                                      p += 1;
 +                                      nr ++;
 +                              } else if ((*p >= 'A') && (*p <= 'F')) {
 +                                      ret *= 10;
 +                                      ret += *p - '7';
 +                                      p += 1;
 +                                      nr ++;
 +                              } else {
 +                                      if (nr < 8) return 0x00000c84;
 +                                      return ret;
 +                              }
 +                              }
 +                      }
 +              }
 +              p++;
 +              pos++;
 +      }
 +      return ret;
 +}
 +
 +/* Update the Flash_Size and the Flash Timing */
 +int update_flash_size (int flash_size)
 +{
 +      volatile immap_t * immr = (immap_t *)CFG_IMMR;
 +      volatile memctl8260_t *memctl = &immr->im_memctl;
 +      unsigned long reg;
 +      unsigned long tim;
 +
 +      /* I must use reg, otherwise the board hang */
 +      reg = memctl->memc_or0;
 +      reg &= ~ORxU_AM_MSK;
 +      reg |= MEG_TO_AM(flash_size >> 20);
 +      tim = get_flash_timing ();
 +      reg &= ~0xfff;
 +      reg |= (tim & 0xfff);
 +      memctl->memc_or0 = reg;
 +      return 0;
 +}
 +#endif
 +
 +#if defined(CONFIG_CMD_NAND)
 +
 +#include <nand.h>
 +#include <linux/mtd/mtd.h>
 +
 +static u8 hwctl = 0;
 +
 +static void upmnand_hwcontrol(struct mtd_info *mtdinfo, int cmd)
 +{
 +      switch (cmd) {
 +      case NAND_CTL_SETCLE:
 +              hwctl |= 0x1;
 +              break;
 +      case NAND_CTL_CLRCLE:
 +              hwctl &= ~0x1;
 +              break;
 +
 +      case NAND_CTL_SETALE:
 +              hwctl |= 0x2;
 +              break;
 +
 +      case NAND_CTL_CLRALE:
 +              hwctl &= ~0x2;
 +              break;
 +      }
 +}
 +
 +static void upmnand_write_byte(struct mtd_info *mtdinfo, u_char byte)
 +{
 +      struct nand_chip *this = mtdinfo->priv;
 +      ulong base = (ulong) (this->IO_ADDR_W + chipsel * CFG_NAND_CS_DIST);
 +
 +      if (hwctl & 0x1) {
 +              WRITE_NAND_UPM(byte, base, CFG_NAND_UPM_WRITE_CMD_OFS);
 +      } else if (hwctl & 0x2) {
 +              WRITE_NAND_UPM(byte, base, CFG_NAND_UPM_WRITE_ADDR_OFS);
 +      } else {
 +              WRITE_NAND(byte, base);
 +      }
 +}
 +
 +static u_char upmnand_read_byte(struct mtd_info *mtdinfo)
 +{
 +      struct nand_chip *this = mtdinfo->priv;
 +      ulong base = (ulong) (this->IO_ADDR_W + chipsel * CFG_NAND_CS_DIST);
 +
 +      return READ_NAND(base);
 +}
 +
 +static int tqm8272_dev_ready(struct mtd_info *mtdinfo)
 +{
 +      /* constant delay (see also tR in the datasheet) */
 +      udelay(12); \
 +      return 1;
 +}
 +
 +#ifndef CONFIG_NAND_SPL
 +static void tqm8272_read_buf(struct mtd_info *mtdinfo, uint8_t *buf, int len)
 +{
 +      struct nand_chip *this = mtdinfo->priv;
 +      unsigned char *base = (unsigned char *) (this->IO_ADDR_W + chipsel * CFG_NAND_CS_DIST);
 +      int     i;
 +
 +      for (i = 0; i< len; i++)
 +              buf[i] = *base;
 +}
 +
 +static void tqm8272_write_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len)
 +{
 +      struct nand_chip *this = mtdinfo->priv;
 +      unsigned char *base = (unsigned char *) (this->IO_ADDR_W + chipsel * CFG_NAND_CS_DIST);
 +      int     i;
 +
 +      for (i = 0; i< len; i++)
 +              *base = buf[i];
 +}
 +
 +static int tqm8272_verify_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len)
 +{
 +      struct nand_chip *this = mtdinfo->priv;
 +      unsigned char *base = (unsigned char *) (this->IO_ADDR_W + chipsel * CFG_NAND_CS_DIST);
 +      int     i;
 +
 +      for (i = 0; i < len; i++)
 +              if (buf[i] != *base)
 +                      return -1;
 +      return 0;
 +}
 +#endif /* #ifndef CONFIG_NAND_SPL */
 +
 +void board_nand_select_device(struct nand_chip *nand, int chip)
 +{
 +      chipsel = chip;
 +}
 +
 +int board_nand_init(struct nand_chip *nand)
 +{
 +      static  int     UpmInit = 0;
 +      volatile immap_t * immr = (immap_t *)CFG_IMMR;
 +      volatile memctl8260_t *memctl = &immr->im_memctl;
 +
 +      if (hwinf.nand == 0) return -1;
 +
 +      /* Setup the UPM */
 +      if (UpmInit == 0) {
 +              switch (hwinf.busclk_real) {
 +              case 100000000:
 +                      upmconfig (UPMB, (uint *) upmTable100,
 +                         sizeof (upmTable100) / sizeof (uint));
 +                      break;
 +              case 133333333:
 +                      upmconfig (UPMB, (uint *) upmTable133,
 +                         sizeof (upmTable133) / sizeof (uint));
 +                      break;
 +              default:
 +                      upmconfig (UPMB, (uint *) upmTable67,
 +                         sizeof (upmTable67) / sizeof (uint));
 +                      break;
 +              }
 +              UpmInit = 1;
 +      }
 +
 +      /* Setup the memctrl */
 +      memctl->memc_or3 = CFG_NAND_OR;
 +      memctl->memc_br3 = CFG_NAND_BR;
 +      memctl->memc_mbmr = (MxMR_OP_NORM);
 +
 +      nand->eccmode = NAND_ECC_SOFT;
 +
 +      nand->hwcontrol  = upmnand_hwcontrol;
 +      nand->read_byte  = upmnand_read_byte;
 +      nand->write_byte = upmnand_write_byte;
 +      nand->dev_ready  = tqm8272_dev_ready;
 +
 +#ifndef CONFIG_NAND_SPL
 +      nand->write_buf  = tqm8272_write_buf;
 +      nand->read_buf   = tqm8272_read_buf;
 +      nand->verify_buf = tqm8272_verify_buf;
 +#endif
 +
 +      /*
 +       * Select required NAND chip
 +       */
 +      board_nand_select_device(nand, 0);
 +      return 0;
 +}
 +
 +#endif
 +
 +#ifdef CONFIG_PCI
 +struct pci_controller hose;
 +
 +int board_early_init_f (void)
 +{
 +      volatile immap_t *immap = (immap_t *) CFG_IMMR;
 +
 +      immap->im_clkrst.car_sccr |= M826X_SCCR_PCI_MODE_EN;
 +      return 0;
 +}
 +
 +extern void pci_mpc8250_init(struct pci_controller *);
 +
 +void pci_init_board(void)
 +{
 +      pci_mpc8250_init(&hose);
 +}
 +#endif