Hi Andre, just a few obligatory remarks...
> Add initial support for Matrix Vision mvSMR board based on MPC5200B. > > Signed-off-by: Andre Schwarz <andre.schw...@matrix-vision.de> > --- > CREDITS | 2 +- > MAINTAINERS | 1 + > MAKEALL | 1 + > Makefile | 5 + > board/matrix_vision/mvsmr/Makefile | 51 ++++++ > board/matrix_vision/mvsmr/autoscript | 43 +++++ > board/matrix_vision/mvsmr/config.mk | 31 ++++ > board/matrix_vision/mvsmr/fpga.c | 151 +++++++++++++++++ > board/matrix_vision/mvsmr/fpga.h | 32 ++++ > board/matrix_vision/mvsmr/mvsmr.c | 276 +++++++++++++++++++++++++++++++ > board/matrix_vision/mvsmr/mvsmr.h | 43 +++++ > board/matrix_vision/mvsmr/u-boot.lds | 138 ++++++++++++++++ > doc/README.mvsmr | 55 +++++++ > include/configs/MVSMR.h | 295 > ++++++++++++++++++++++++++++++++++ > 14 files changed, 1123 insertions(+), 1 deletions(-) > create mode 100644 board/matrix_vision/mvsmr/Makefile > create mode 100644 board/matrix_vision/mvsmr/autoscript > create mode 100644 board/matrix_vision/mvsmr/config.mk > create mode 100644 board/matrix_vision/mvsmr/fpga.c > create mode 100644 board/matrix_vision/mvsmr/fpga.h > create mode 100644 board/matrix_vision/mvsmr/mvsmr.c > create mode 100644 board/matrix_vision/mvsmr/mvsmr.h > create mode 100644 board/matrix_vision/mvsmr/u-boot.lds > create mode 100644 doc/README.mvsmr > create mode 100644 include/configs/MVSMR.h > [...] > diff --git a/board/matrix_vision/mvsmr/fpga.c > b/board/matrix_vision/mvsmr/fpga.c > new file mode 100644 > index 0000000..3fe55f2 > --- /dev/null > +++ b/board/matrix_vision/mvsmr/fpga.c > @@ -0,0 +1,151 @@ > +/* > + * (C) Copyright 2002 > + * Rich Ireland, Enterasys Networks, rirel...@enterasys.com. > + * Keith Outwater, keith_outwa...@mvis.com. > + * > + * (C) Copyright 2010 > + * Andre Schwarz, Matrix Vision GmbH, andre.schw...@matrix-vision.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 <spartan3.h> > +#include <command.h> > +#include "fpga.h" > +#include "mvsmr.h" > + > +#ifdef FPGA_DEBUG > +#define fpga_debug(fmt, args...) printf("%s: "fmt, __func__, ##args) > +#else > +#define fpga_debug(fmt, args...) > +#endif Do you really insist on yet another debug macro? I know it includes the function, but is it really worth it? > + > + > +Xilinx_Spartan3_Slave_Serial_fns fpga_fns = { > + fpga_pre_config_fn, > + fpga_pgm_fn, > + fpga_clk_fn, > + fpga_init_fn, > + fpga_done_fn, > + fpga_wr_fn, > + 0 > +}; > + > +Xilinx_desc spartan3 = { > + Xilinx_Spartan2, > + slave_serial, > + XILINX_XC3S200_SIZE, > + (void *) &fpga_fns, > + 0, > +}; > + > +DECLARE_GLOBAL_DATA_PTR; > + > +int mvsmr_init_fpga(void) > +{ > + fpga_debug("Initialize FPGA interface\n"); > + fpga_init(); > + fpga_add(fpga_xilinx, &spartan3); > + > + return 1; > +} > + > +int fpga_init_fn(int cookie) > +{ > + struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO; > + > + fpga_debug("INIT check ... "); > + if (gpio->simple_ival & FPGA_CONFIG) { Use accessor functions. > + fpga_debug("high"); > + return 0; > + } else { > + fpga_debug("low"); > + return 1; > + } > +} > + > +int fpga_done_fn(int cookie) > +{ > + struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO; > + int result = 0; > + > + udelay(10); > + fpga_debug("CONF_DONE check ... "); > + if (gpio->simple_ival & FPGA_DONE) { Accessors. > + fpga_debug("high\n"); > + result = 1; > + } else > + fpga_debug("low\n"); > + > + return result; > +} > + > +int fpga_pgm_fn(int assert, int flush, int cookie) > +{ > + struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO; > + > + fpga_debug("SET prog : %s\n", assert ? "low" : "high"); > + if (!assert) > + gpio->sint_dvo |= FPGA_STATUS; > + else > + gpio->sint_dvo &= ~FPGA_STATUS; Accessors. > + > + return assert; > +} > + > +int fpga_clk_fn(int assert_clk, int flush, int cookie) > +{ > + struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO; > + u32 dvo = gpio->simple_dvo; > + > + fpga_debug("CLOCK %s\n", assert_clk ? "high" : "low"); > + if (assert_clk) > + dvo |= FPGA_CCLK; > + else > + dvo &= ~FPGA_CCLK; > + > + if (flush) > + gpio->simple_dvo = dvo; Again. > + > + return assert_clk; > +} > + > +int fpga_wr_fn(int assert_write, int flush, int cookie) > +{ > + struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO; > + > + debug("SET data : %d\n", assert_write ? 1 : 0); > + if (assert_write) > + gpio->simple_dvo |= FPGA_DIN; > + else > + gpio->simple_dvo &= ~FPGA_DIN; Again. > + > + return assert_write; > +} > + > +int fpga_pre_config_fn(int cookie) > +{ > + struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO; > + > + gpio->sint_dvo |= FPGA_STATUS; And once more. > + > + return 0; > +} > diff --git a/board/matrix_vision/mvsmr/fpga.h > b/board/matrix_vision/mvsmr/fpga.h > new file mode 100644 > index 0000000..ee690e6 > --- /dev/null > +++ b/board/matrix_vision/mvsmr/fpga.h > @@ -0,0 +1,32 @@ > +/* > + * (C) Copyright 2008 > + * Andre Schwarz, Matrix Vision GmbH, andre.schw...@matrix-vision.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 > + * > + */ > + > +extern int mvsmr_init_fpga(void); > + > +extern int fpga_pgm_fn(int assert_pgm, int flush, int cookie); > +extern int fpga_init_fn(int cookie); > +extern int fpga_clk_fn(int assert_clk, int flush, int cookie); > +extern int fpga_wr_fn(int assert_write, int flush, int cookie); > +extern int fpga_done_fn(int cookie); > +extern int fpga_pre_config_fn(int cookie); > diff --git a/board/matrix_vision/mvsmr/mvsmr.c > b/board/matrix_vision/mvsmr/mvsmr.c > new file mode 100644 > index 0000000..e588ed9 > --- /dev/null > +++ b/board/matrix_vision/mvsmr/mvsmr.c > @@ -0,0 +1,276 @@ > +/* > + * (C) Copyright 2003 > + * Wolfgang Denk, DENX Software Engineering, w...@denx.de. > + * > + * (C) Copyright 2004 > + * Mark Jonas, Freescale Semiconductor, mark.jo...@motorola.com. > + * > + * (C) Copyright 2005-2010 > + * Andre Schwarz, Matrix Vision GmbH, andre.schw...@matrix-vision.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 <mpc5xxx.h> > +#include <malloc.h> > +#include <pci.h> > +#include <i2c.h> > +#include <fpga.h> > +#include <environment.h> > +#include <netdev.h> > +#include <asm/io.h> > +#include "fpga.h" > +#include "mvsmr.h" > +#include "../common/mv_common.h" > + > +#define SDRAM_DDR 1 > +#define SDRAM_MODE 0x018D0000 > +#define SDRAM_EMODE 0x40090000 > +#define SDRAM_CONTROL 0x715f0f00 > +#define SDRAM_CONFIG1 0xd3722930 > +#define SDRAM_CONFIG2 0x46770000 > + > +DECLARE_GLOBAL_DATA_PTR; > + > +static void sdram_start(int hi_addr) > +{ > + long hi_bit = hi_addr ? 0x01000000 : 0; > + > + /* unlock mode register */ > + out_be32((u32 *)MPC5XXX_SDRAM_CTRL, SDRAM_CONTROL | 0x80000000 | > + hi_bit); > + > + /* precharge all banks */ > + out_be32((u32 *)MPC5XXX_SDRAM_CTRL, SDRAM_CONTROL | 0x80000002 | > + hi_bit); > + > + /* set mode register: extended mode */ > + *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_EMODE; > + __asm__ volatile ("sync"); Mixing accessors and direct pointer accesses? Please update all to using the accessors. > + > + /* set mode register: reset DLL */ > + *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_MODE | 0x04000000; > + __asm__ volatile ("sync"); Dito. > + > + /* precharge all banks */ > + out_be32((u32 *)MPC5XXX_SDRAM_CTRL, SDRAM_CONTROL | 0x80000002 | > + hi_bit); > + > + /* auto refresh */ > + out_be32((u32 *)MPC5XXX_SDRAM_CTRL, SDRAM_CONTROL | 0x80000004 | > + hi_bit); > + > + /* set mode register */ > + out_be32((u32 *)MPC5XXX_SDRAM_MODE, SDRAM_MODE); > + > + /* normal operation */ > + out_be32((u32 *)MPC5XXX_SDRAM_CTRL, SDRAM_CONTROL | hi_bit); > +} > + > +phys_addr_t initdram(int board_type) > +{ > + ulong dramsize = 0; > + ulong test1, > + test2; > + > + /* setup SDRAM chip selects */ > + out_be32((u32 *)MPC5XXX_SDRAM_CS0CFG, 0x0000001e); > + > + /* setup config registers */ > + out_be32((u32 *)MPC5XXX_SDRAM_CONFIG1, SDRAM_CONFIG1); > + out_be32((u32 *)MPC5XXX_SDRAM_CONFIG2, SDRAM_CONFIG2); > + > + /* find RAM size using SDRAM CS0 only */ > + sdram_start(0); > + test1 = get_ram_size((long *)CONFIG_SYS_SDRAM_BASE, 0x80000000); > + sdram_start(1); > + test2 = get_ram_size((long *)CONFIG_SYS_SDRAM_BASE, 0x80000000); > + if (test1 > test2) { > + sdram_start(0); > + dramsize = test1; > + } else > + dramsize = test2; > + > + if (dramsize < (1 << 20)) > + dramsize = 0; > + > + if (dramsize > 0) > + out_be32((u32 *)MPC5XXX_SDRAM_CS0CFG, 0x13 + > + __builtin_ffs(dramsize >> 20) - 1); > + else > + out_be32((u32 *)MPC5XXX_SDRAM_CS0CFG, 0); > + > + return dramsize; > +} > + > +void mvsmr_init_gpio(void) > +{ > + struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO; > + struct mpc5xxx_gpt_0_7 *timers = (struct mpc5xxx_gpt_0_7 *)MPC5XXX_GPT; > + > + printf("Ports : 0x%08x\n", gpio->port_config); > + printf("PORCFG: 0x%08x\n", in_be32((unsigned *)MPC5XXX_CDM_PORCFG)); > + > + out_be32(&gpio->simple_ddr, SIMPLE_DDR); > + out_be32(&gpio->simple_dvo, SIMPLE_DVO); > + out_be32(&gpio->simple_ode, SIMPLE_ODE); > + out_be32(&gpio->simple_gpioe, SIMPLE_GPIOEN); > + > + out_8(&gpio->sint_ode, SINT_ODE); > + out_8(&gpio->sint_ddr, SINT_DDR); > + out_8(&gpio->sint_dvo, SINT_DVO); > + out_8(&gpio->sint_inten, SINT_INTEN); > + out_be16(&gpio->sint_itype, SINT_ITYPE); > + out_8(&gpio->sint_gpioe, SINT_GPIOEN); > + > + out_8((u8 *)MPC5XXX_WU_GPIO_ODE, WKUP_ODE); > + out_8((u8 *)MPC5XXX_WU_GPIO_DIR, WKUP_DIR); > + out_8((u8 *)MPC5XXX_WU_GPIO_DATA_O, WKUP_DO); > + out_8((u8 *)MPC5XXX_WU_GPIO_ENABLE, WKUP_EN); Actually we have a "struct mpc5xxx_wu_gpio", so please use it. > + > + out_be32(&timers->gpt0.emsr, 0x00000234); /* OD output high */ > + out_be32(&timers->gpt1.emsr, 0x00000234); > + out_be32(&timers->gpt2.emsr, 0x00000234); > + out_be32(&timers->gpt3.emsr, 0x00000234); > + out_be32(&timers->gpt4.emsr, 0x00000234); > + out_be32(&timers->gpt5.emsr, 0x00000234); > + out_be32(&timers->gpt6.emsr, 0x00000024); /* push-pull output low */ > + out_be32(&timers->gpt7.emsr, 0x00000024); > + > + printf("simple_gpioe: 0x%08x\n", gpio->simple_gpioe); > + printf("sint_gpioe : 0x%08x\n", gpio->sint_gpioe); > +} > + > +int misc_init_r(void) > +{ > + char *s = getenv("reset_env"); > + > + if (s) { > + printf(" === FACTORY RESET ===\n"); > + mv_reset_environment(); > + saveenv(); > + } > + > + return -1; > +} > + > +void mvsmr_get_dbg_present(void) > +{ > + struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO; > + struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)MPC5XXX_PSC1; > + > + if (gpio->simple_ival & COP_PRESENT) { Good ol' accessors. > + setenv("dbg_present", "no\0"); > + setenv("bootstopkey", "abcdefghijklmnopqrstuvwxyz\0"); > + } else { > + setenv("dbg_present", "yes\0"); > + setenv("bootstopkey", "s\0"); > + psc->command |= PSC_RX_ENABLE; Again. > + } > +} > + > +void mvsmr_get_service_mode(void) > +{ > + struct mpc5xxx_wu_gpio *wu_gpio = > + (struct mpc5xxx_wu_gpio *)MPC5XXX_WU_GPIO; > + > + if (wu_gpio->ival & SERVICE_MODE) And again. > + setenv("servicemode", "no\0"); > + else > + setenv("servicemode", "yes\0"); > +} > + > +int mvsmr_get_mac(void) > +{ > + char *data, *mac; > + struct mpc5xxx_wu_gpio *wu_gpio = > + (struct mpc5xxx_wu_gpio *)MPC5XXX_WU_GPIO; Aha, so you _did_ find it before ;) > + > + if (wu_gpio->ival & LAN_PRSNT) { Accessors > + setenv("lan_present", "no\0"); > + return -1; > + } else > + setenv("lan_present", "yes\0"); > + > + data = malloc(10); > + mac = malloc(32); > + memset(data, 0, sizeof(data)); > + memset(mac, 0, sizeof(mac)); > + > + i2c_read(0x50, 0, 1, (unsigned char *)data, 6); > + > + sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x", > + data[0], data[1], data[2], data[3], data[4], data[5]); > + setenv("ethaddr", mac); > + free(data); > + free(mac); > + > + return 0; > +} > + > +int checkboard(void) > +{ > + mvsmr_init_gpio(); > + printf("Board: Matrix Vision mvSMR\n"); > + > + return 0; > +} > + > +void flash_preinit(void) > +{ > + /* > + * Now, when we are in RAM, enable flash write > + * access for detection process. > + * Note that CS_BOOT cannot be cleared when > + * executing in flash. > + */ > + clrbits_be32((u32 *)MPC5XXX_BOOTCS_CFG, 0x1); > +} > + > +void flash_afterinit(ulong size) > +{ > + out_be32((u32 *)MPC5XXX_BOOTCS_START, > + START_REG(CONFIG_SYS_BOOTCS_START | size)); > + out_be32((u32 *)MPC5XXX_CS0_START, > + START_REG(CONFIG_SYS_BOOTCS_START | size)); > + out_be32((u32 *)MPC5XXX_BOOTCS_STOP, > + STOP_REG(CONFIG_SYS_BOOTCS_START | size, size)); > + out_be32((u32 *)MPC5XXX_CS0_STOP, > + STOP_REG(CONFIG_SYS_BOOTCS_START | size, size)); > +} > + > +struct pci_controller hose; > + > +void pci_init_board(void) > +{ > + mvsmr_get_dbg_present(); > + mvsmr_get_service_mode(); > + mvsmr_init_fpga(); > + mv_load_fpga(); > + pci_mpc5xxx_init(&hose); > +} > + > +int board_eth_init(bd_t *bis) > +{ > + if (!mvsmr_get_mac()) > + return cpu_eth_init(bis); > + > + return pci_eth_init(bis); > +} [...] Cheers Detlev -- Markov does it in chains. -- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-40 Fax: (+49)-8142-66989-80 Email: d...@denx.de _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot