]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - board/lwmon5/lwmon5.c
Standardize command usage messages with cmd_usage()
[karo-tx-uboot.git] / board / lwmon5 / lwmon5.c
index d916284753d3759822112c4f241982ce1c9825c5..adecad0f8d88a9d52a4d9e49c31067c7484a8b51 100644 (file)
@@ -19,6 +19,7 @@
  */
 
 #include <common.h>
+#include <command.h>
 #include <ppc440.h>
 #include <asm/processor.h>
 #include <asm/gpio.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-extern flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips   */
+extern flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS]; /* info for FLASH chips    */
 
-ulong flash_get_size (ulong base, int banknum);
+ulong flash_get_size(ulong base, int banknum);
+int misc_init_r_kbd(void);
 
 int board_early_init_f(void)
 {
@@ -45,16 +47,16 @@ int board_early_init_f(void)
        mtdcr(uic0sr, 0xffffffff);  /* clear all. if write with 1 then the status is cleared  */
        mtdcr(uic0er, 0x00000000);  /* disable all */
        mtdcr(uic0cr, 0x00000000);  /* we have not critical interrupts at the moment */
-       mtdcr(uic0pr, 0xfffff7ff);  /* Adjustment of the polarity */
-       mtdcr(uic0tr, 0x00000810);  /* per ref-board manual */
+       mtdcr(uic0pr, 0xFFBFF1EF);  /* Adjustment of the polarity */
+       mtdcr(uic0tr, 0x00000900);  /* per ref-board manual */
        mtdcr(uic0vr, 0x00000000);  /* int31 highest, base=0x000 is within DDRAM */
        mtdcr(uic0sr, 0xffffffff);  /* clear all */
 
        mtdcr(uic1sr, 0xffffffff);  /* clear all */
        mtdcr(uic1er, 0x00000000);  /* disable all */
        mtdcr(uic1cr, 0x00000000);  /* all non-critical */
-       mtdcr(uic1pr, 0xFFFFC7AD);  /* Adjustment of the polarity */
-       mtdcr(uic1tr, 0x0600384A);  /* per ref-board manual */
+       mtdcr(uic1pr, 0xFFFFC6A5);  /* Adjustment of the polarity */
+       mtdcr(uic1tr, 0x60000040);  /* per ref-board manual */
        mtdcr(uic1vr, 0x00000000);  /* int31 highest, base=0x000 is within DDRAM */
        mtdcr(uic1sr, 0xffffffff);  /* clear all */
 
@@ -62,9 +64,9 @@ int board_early_init_f(void)
        mtdcr(uic2er, 0x00000000);  /* disable all */
        mtdcr(uic2cr, 0x00000000);  /* all non-critical */
        mtdcr(uic2pr, 0x27C00000);  /* Adjustment of the polarity */
-       mtdcr(uic2tr, 0xDFC00000);  /* per ref-board manual */
+       mtdcr(uic2tr, 0x3C000000);  /* per ref-board manual */
        mtdcr(uic2vr, 0x00000000);  /* int31 highest, base=0x000 is within DDRAM */
-       mtdcr(uic2sr, 0xffffffff);  /* clear all. Why this??? */
+       mtdcr(uic2sr, 0xffffffff);  /* clear all */
 
        /* Trace Pins are disabled. SDR0_PFC0 Register */
        mtsdr(SDR0_PFC0, 0x0);
@@ -92,7 +94,43 @@ int board_early_init_f(void)
        reg = 0;
        mtsdr(sdr_pci0, 0x00000000 | reg);
 
-       gpio_write_bit(CFG_GPIO_FLASH_WP, 1);
+       gpio_write_bit(CONFIG_SYS_GPIO_FLASH_WP, 1);
+
+#if CONFIG_POST & CONFIG_SYS_POST_BSPEC1
+       gpio_write_bit(CONFIG_SYS_GPIO_HIGHSIDE, 1);
+
+       reg = 0; /* reuse as counter */
+       out_be32((void *)CONFIG_SYS_DSPIC_TEST_ADDR,
+               in_be32((void *)CONFIG_SYS_DSPIC_TEST_ADDR)
+                       & ~CONFIG_SYS_DSPIC_TEST_MASK);
+       while (!gpio_read_in_bit(CONFIG_SYS_GPIO_DSPIC_READY) && reg++ < 1000) {
+               udelay(1000);
+       }
+       gpio_write_bit(CONFIG_SYS_GPIO_HIGHSIDE, 0);
+       if (gpio_read_in_bit(CONFIG_SYS_GPIO_DSPIC_READY)) {
+               /* set "boot error" flag */
+               out_be32((void *)CONFIG_SYS_DSPIC_TEST_ADDR,
+                       in_be32((void *)CONFIG_SYS_DSPIC_TEST_ADDR) |
+                       CONFIG_SYS_DSPIC_TEST_MASK);
+       }
+#endif
+
+       /*
+        * Reset PHY's:
+        * The PHY's need a 2nd reset pulse, since the MDIO address is latched
+        * upon reset, and with the first reset upon powerup, the addresses are
+        * not latched reliable, since the IRQ line is multiplexed with an
+        * MDIO address. A 2nd reset at this time will make sure, that the
+        * correct address is latched.
+        */
+       gpio_write_bit(CONFIG_SYS_GPIO_PHY0_RST, 1);
+       gpio_write_bit(CONFIG_SYS_GPIO_PHY1_RST, 1);
+       udelay(1000);
+       gpio_write_bit(CONFIG_SYS_GPIO_PHY0_RST, 0);
+       gpio_write_bit(CONFIG_SYS_GPIO_PHY1_RST, 0);
+       udelay(1000);
+       gpio_write_bit(CONFIG_SYS_GPIO_PHY0_RST, 1);
+       gpio_write_bit(CONFIG_SYS_GPIO_PHY1_RST, 1);
 
        return 0;
 }
@@ -156,15 +194,15 @@ int misc_init_r(void)
 
        /* Monitor protection ON by default */
        (void)flash_protect(FLAG_PROTECT_SET,
-                           -CFG_MONITOR_LEN,
+                           -CONFIG_SYS_MONITOR_LEN,
                            0xffffffff,
-                           &flash_info[0]);
+                           &flash_info[1]);
 
        /* Env protection ON by default */
        (void)flash_protect(FLAG_PROTECT_SET,
-                           CFG_ENV_ADDR_REDUND,
-                           CFG_ENV_ADDR_REDUND + 2*CFG_ENV_SECT_SIZE - 1,
-                           &flash_info[0]);
+                           CONFIG_ENV_ADDR_REDUND,
+                           CONFIG_ENV_ADDR_REDUND + 2*CONFIG_ENV_SECT_SIZE - 1,
+                           &flash_info[1]);
 
        /*
         * USB suff...
@@ -215,27 +253,9 @@ int misc_init_r(void)
        mtdcr(plb4_acr, reg);
 
        /*
-        * Reset Lime controller
-        */
-       gpio_write_bit(CFG_GPIO_LIME_S, 1);
-       udelay(500);
-       gpio_write_bit(CFG_GPIO_LIME_RST, 1);
-
-       /* Lime memory clock adjusted to 133MHz */
-       out_be32((void *)CFG_LIME_SDRAM_CLOCK, CFG_LIME_CLOCK_133MHZ);
-       /* Wait untill time expired. Because of requirements in lime manual */
-       udelay(300);
-       /* Write lime controller memory parameters */
-       out_be32((void *)CFG_LIME_MMR, CFG_LIME_MMR_VALUE);
-
-       /*
-        * Reset PHY's
+        * Init matrix keyboard
         */
-       gpio_write_bit(CFG_GPIO_PHY0_RST, 0);
-       gpio_write_bit(CFG_GPIO_PHY1_RST, 0);
-       udelay(100);
-       gpio_write_bit(CFG_GPIO_PHY0_RST, 1);
-       gpio_write_bit(CFG_GPIO_PHY1_RST, 1);
+       misc_init_r_kbd();
 
        return 0;
 }
@@ -255,44 +275,6 @@ int checkboard(void)
        return (0);
 }
 
-#if defined(CFG_DRAM_TEST)
-int testdram(void)
-{
-       unsigned long *mem = (unsigned long *)0;
-       const unsigned long kend = (1024 / sizeof(unsigned long));
-       unsigned long k, n;
-
-       mtmsr(0);
-
-       for (k = 0; k < CFG_MBYTES_SDRAM;
-            ++k, mem += (1024 / sizeof(unsigned long))) {
-               if ((k & 1023) == 0) {
-                       printf("%3d MB\r", k / 1024);
-               }
-
-               memset(mem, 0xaaaaaaaa, 1024);
-               for (n = 0; n < kend; ++n) {
-                       if (mem[n] != 0xaaaaaaaa) {
-                               printf("SDRAM test fails at: %08x\n",
-                                      (uint) & mem[n]);
-                               return 1;
-                       }
-               }
-
-               memset(mem, 0x55555555, 1024);
-               for (n = 0; n < kend; ++n) {
-                       if (mem[n] != 0x55555555) {
-                               printf("SDRAM test fails at: %08x\n",
-                                      (uint) & mem[n]);
-                               return 1;
-                       }
-               }
-       }
-       printf("SDRAM test passes\n");
-       return 0;
-}
-#endif
-
 /*************************************************************************
  *  pci_pre_init
  *
@@ -356,7 +338,7 @@ int pci_pre_init(struct pci_controller *hose)
  *     may not be sufficient for a given board.
  *
  ************************************************************************/
-#if defined(CONFIG_PCI) && defined(CFG_PCI_TARGET_INIT)
+#if defined(CONFIG_PCI) && defined(CONFIG_SYS_PCI_TARGET_INIT)
 void pci_target_init(struct pci_controller *hose)
 {
        /*--------------------------------------------------------------------------+
@@ -370,14 +352,14 @@ void pci_target_init(struct pci_controller *hose)
          | Make this region non-prefetchable.
          +--------------------------------------------------------------------------*/
        out32r(PCIX0_PMM0MA, 0x00000000);       /* PMM0 Mask/Attribute - disabled b4 setting */
-       out32r(PCIX0_PMM0LA, CFG_PCI_MEMBASE);  /* PMM0 Local Address */
-       out32r(PCIX0_PMM0PCILA, CFG_PCI_MEMBASE);       /* PMM0 PCI Low Address */
+       out32r(PCIX0_PMM0LA, CONFIG_SYS_PCI_MEMBASE);   /* PMM0 Local Address */
+       out32r(PCIX0_PMM0PCILA, CONFIG_SYS_PCI_MEMBASE);        /* PMM0 PCI Low Address */
        out32r(PCIX0_PMM0PCIHA, 0x00000000);    /* PMM0 PCI High Address */
        out32r(PCIX0_PMM0MA, 0xE0000001);       /* 512M + No prefetching, and enable region */
 
        out32r(PCIX0_PMM1MA, 0x00000000);       /* PMM0 Mask/Attribute - disabled b4 setting */
-       out32r(PCIX0_PMM1LA, CFG_PCI_MEMBASE2); /* PMM0 Local Address */
-       out32r(PCIX0_PMM1PCILA, CFG_PCI_MEMBASE2);      /* PMM0 PCI Low Address */
+       out32r(PCIX0_PMM1LA, CONFIG_SYS_PCI_MEMBASE2); /* PMM0 Local Address */
+       out32r(PCIX0_PMM1PCILA, CONFIG_SYS_PCI_MEMBASE2);       /* PMM0 PCI Low Address */
        out32r(PCIX0_PMM1PCIHA, 0x00000000);    /* PMM0 PCI High Address */
        out32r(PCIX0_PMM1MA, 0xE0000001);       /* 512M + No prefetching, and enable region */
 
@@ -392,8 +374,8 @@ void pci_target_init(struct pci_controller *hose)
 
        /* Program the board's subsystem id/vendor id */
        pci_write_config_word(0, PCI_SUBSYSTEM_VENDOR_ID,
-                             CFG_PCI_SUBSYS_VENDORID);
-       pci_write_config_word(0, PCI_SUBSYSTEM_ID, CFG_PCI_SUBSYS_ID);
+                             CONFIG_SYS_PCI_SUBSYS_VENDORID);
+       pci_write_config_word(0, PCI_SUBSYSTEM_ID, CONFIG_SYS_PCI_SUBSYS_ID);
 
        /* Configure command register as bus master */
        pci_write_config_word(0, PCI_COMMAND, PCI_COMMAND_MASTER);
@@ -407,13 +389,13 @@ void pci_target_init(struct pci_controller *hose)
        pci_write_config_dword(0, PCI_BRDGOPT2, 0x00000101);
 
 }
-#endif                         /* defined(CONFIG_PCI) && defined(CFG_PCI_TARGET_INIT) */
+#endif                         /* defined(CONFIG_PCI) && defined(CONFIG_SYS_PCI_TARGET_INIT) */
 
 /*************************************************************************
  *  pci_master_init
  *
  ************************************************************************/
-#if defined(CONFIG_PCI) && defined(CFG_PCI_MASTER_INIT)
+#if defined(CONFIG_PCI) && defined(CONFIG_SYS_PCI_MASTER_INIT)
 void pci_master_init(struct pci_controller *hose)
 {
        unsigned short temp_short;
@@ -428,7 +410,7 @@ void pci_master_init(struct pci_controller *hose)
                              temp_short | PCI_COMMAND_MASTER |
                              PCI_COMMAND_MEMORY);
 }
-#endif                         /* defined(CONFIG_PCI) && defined(CFG_PCI_MASTER_INIT) */
+#endif                         /* defined(CONFIG_PCI) && defined(CONFIG_SYS_PCI_MASTER_INIT) */
 
 /*************************************************************************
  *  is_pci_host
@@ -456,10 +438,162 @@ int is_pci_host(struct pci_controller *hose)
 void hw_watchdog_reset(void)
 {
        int val;
+#if defined(CONFIG_WD_MAX_RATE)
+       unsigned long long ct = get_ticks();
+
+       /*
+        * Don't allow watch-dog triggering more frequently than
+        * the predefined value CONFIG_WD_MAX_RATE [ticks].
+        */
+       if (ct >= gd->wdt_last) {
+               if ((ct - gd->wdt_last) < CONFIG_WD_MAX_RATE)
+                       return;
+       } else {
+               /* Time base counter had been reset */
+               if (((unsigned long long)(-1) - gd->wdt_last + ct) <
+                   CONFIG_WD_MAX_RATE)
+                       return;
+       }
+       gd->wdt_last = get_ticks();
+#endif
 
        /*
         * Toggle watchdog output
         */
-       val = gpio_read_out_bit(CFG_GPIO_WATCHDOG) == 0 ? 1 : 0;
-       gpio_write_bit(CFG_GPIO_WATCHDOG, val);
+       val = gpio_read_out_bit(CONFIG_SYS_GPIO_WATCHDOG) == 0 ? 1 : 0;
+       gpio_write_bit(CONFIG_SYS_GPIO_WATCHDOG, val);
+}
+
+int do_eeprom_wp(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       if (argc < 2) {
+               cmd_usage(cmdtp);
+               return 1;
+       }
+
+       if ((strcmp(argv[1], "on") == 0)) {
+               gpio_write_bit(CONFIG_SYS_GPIO_EEPROM_EXT_WP, 1);
+       } else if ((strcmp(argv[1], "off") == 0)) {
+               gpio_write_bit(CONFIG_SYS_GPIO_EEPROM_EXT_WP, 0);
+       } else {
+               cmd_usage(cmdtp);
+               return 1;
+       }
+
+
+       return 0;
+}
+
+U_BOOT_CMD(
+       eepromwp,       2,      0,      do_eeprom_wp,
+       "eepromwp- eeprom write protect off/on\n",
+       "<on|off> - enable (on) or disable (off) I2C EEPROM write protect\n"
+);
+
+#if defined(CONFIG_VIDEO)
+#include <video_fb.h>
+#include <mb862xx.h>
+
+extern GraphicDevice mb862xx;
+
+static const gdc_regs init_regs [] =
+{
+       {0x0100, 0x00000f00},
+       {0x0020, 0x801401df},
+       {0x0024, 0x00000000},
+       {0x0028, 0x00000000},
+       {0x002c, 0x00000000},
+       {0x0110, 0x00000000},
+       {0x0114, 0x00000000},
+       {0x0118, 0x01df0280},
+       {0x0004, 0x031f0000},
+       {0x0008, 0x027f027f},
+       {0x000c, 0x015f028f},
+       {0x0010, 0x020c0000},
+       {0x0014, 0x01df01ea},
+       {0x0018, 0x00000000},
+       {0x001c, 0x01e00280},
+       {0x0100, 0x80010f00},
+       {0x0, 0x0}
+};
+
+const gdc_regs *board_get_regs (void)
+{
+       return init_regs;
+}
+
+/* Returns Lime base address */
+unsigned int board_video_init (void)
+{
+       /*
+        * Reset Lime controller
+        */
+       gpio_write_bit(CONFIG_SYS_GPIO_LIME_S, 1);
+       udelay(500);
+       gpio_write_bit(CONFIG_SYS_GPIO_LIME_RST, 1);
+
+       /* Lime memory clock adjusted to 100MHz */
+       out_be32((void *)CONFIG_SYS_LIME_SDRAM_CLOCK, CONFIG_SYS_LIME_CLOCK_100MHZ);
+       /* Wait untill time expired. Because of requirements in lime manual */
+       udelay(300);
+       /* Write lime controller memory parameters */
+       out_be32((void *)CONFIG_SYS_LIME_MMR, CONFIG_SYS_LIME_MMR_VALUE);
+
+       mb862xx.winSizeX = 640;
+       mb862xx.winSizeY = 480;
+       mb862xx.gdfBytesPP = 2;
+       mb862xx.gdfIndex = GDF_15BIT_555RGB;
+
+       return CONFIG_SYS_LIME_BASE_0;
+}
+
+#define DEFAULT_BRIGHTNESS 0x64
+
+static void board_backlight_brightness(int brightness)
+{
+       if (brightness > 0) {
+               /* pwm duty, lamp on */
+               out_be32((void *)(CONFIG_SYS_FPGA_BASE_0 + 0x00000024), brightness);
+               out_be32((void *)(CONFIG_SYS_FPGA_BASE_0 + 0x00000020), 0x701);
+       } else {
+               /* lamp off */
+               out_be32((void *)(CONFIG_SYS_FPGA_BASE_0 + 0x00000024), 0x00);
+               out_be32((void *)(CONFIG_SYS_FPGA_BASE_0 + 0x00000020), 0x00);
+       }
+}
+
+void board_backlight_switch (int flag)
+{
+       char * param;
+       int rc;
+
+       if (flag) {
+               param = getenv("brightness");
+               rc = param ? simple_strtol(param, NULL, 10) : -1;
+               if (rc < 0)
+                       rc = DEFAULT_BRIGHTNESS;
+       } else {
+               rc = 0;
+       }
+       board_backlight_brightness(rc);
+}
+
+#if defined(CONFIG_CONSOLE_EXTRA_INFO)
+/*
+ * Return text to be printed besides the logo.
+ */
+void video_get_info_str (int line_number, char *info)
+{
+       if (line_number == 1) {
+               strcpy (info, " Board: Lwmon5 (Liebherr Elektronik GmbH)");
+       } else {
+               info [0] = '\0';
+       }
+}
+#endif
+#endif /* CONFIG_VIDEO */
+
+void board_reset(void)
+{
+       gpio_write_bit(CONFIG_SYS_GPIO_BOARD_RESET, 1);
 }