]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - lib_arm/armlinux.c
esd PMC405 board updated
[karo-tx-uboot.git] / lib_arm / armlinux.c
index 0b3d01e12fc3034b606d77f7fe82c2f87378a002..d15860578a90906799c4881e7a5b05bd85e650d4 100644 (file)
  *
  * 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
+ * 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307         USA
  *
  */
 
 #include <dataflash.h>
 #endif
 
-#include <asm/setup.h>
-#define tag_size(type)  ((sizeof(struct tag_header) + sizeof(struct type)) >> 2)
-#define tag_next(t)     ((struct tag *)((u32 *)(t) + (t)->hdr.size))
-
 /*cmd_boot.c*/
 extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
 
 #if defined (CONFIG_SETUP_MEMORY_TAGS) || \
     defined (CONFIG_CMDLINE_TAG) || \
     defined (CONFIG_INITRD_TAG) || \
-    defined (CONFIG_VFD)
+    defined (CONFIG_SERIAL_TAG) || \
+    defined (CONFIG_REVISION_TAG) || \
+    defined (CONFIG_VFD) || \
+    defined (CONFIG_LCD)
 static void setup_start_tag (bd_t *bd);
 
 # ifdef CONFIG_SETUP_MEMORY_TAGS
@@ -57,7 +56,7 @@ static void setup_initrd_tag (bd_t *bd, ulong initrd_start,
 # endif
 static void setup_end_tag (bd_t *bd);
 
-# if defined (CONFIG_VFD)
+# if defined (CONFIG_VFD) || defined (CONFIG_LCD)
 static void setup_videolfb_tag (gd_t *gd);
 # endif
 
@@ -83,7 +82,7 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
        ulong len = 0, checksum;
        ulong initrd_start, initrd_end;
        ulong data;
-       void (*theKernel) (int zero, int arch);
+       void (*theKernel)(int zero, int arch, uint params);
        image_header_t *hdr = &header;
        bd_t *bd = gd->bd;
 
@@ -91,7 +90,7 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
        char *commandline = getenv ("bootargs");
 #endif
 
-       theKernel = (void (*)(int, int)) ntohl (hdr->ih_ep);
+       theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep);
 
        /*
         * Check if there is an initrd image
@@ -168,6 +167,14 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
                        do_reset (cmdtp, flag, argc, argv);
                }
 
+#if defined(CONFIG_B2) || defined(CONFIG_EVB4510)
+               /*
+                *we need to copy the ramdisk to SRAM to let Linux boot
+                */
+               memmove ((void *) ntohl(hdr->ih_load), (uchar *)data, len);
+               data = ntohl(hdr->ih_load);
+#endif /* CONFIG_B2 || CONFIG_EVB4510 */
+
                /*
                 * Now check if we have a multifile image
                 */
@@ -221,8 +228,17 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
 #if defined (CONFIG_SETUP_MEMORY_TAGS) || \
     defined (CONFIG_CMDLINE_TAG) || \
     defined (CONFIG_INITRD_TAG) || \
+    defined (CONFIG_SERIAL_TAG) || \
+    defined (CONFIG_REVISION_TAG) || \
+    defined (CONFIG_LCD) || \
     defined (CONFIG_VFD)
        setup_start_tag (bd);
+#ifdef CONFIG_SERIAL_TAG
+       setup_serial_tag (&params);
+#endif
+#ifdef CONFIG_REVISION_TAG
+       setup_revision_tag (&params);
+#endif
 #ifdef CONFIG_SETUP_MEMORY_TAGS
        setup_memory_tags (bd);
 #endif
@@ -233,7 +249,7 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
        if (initrd_start && initrd_end)
                setup_initrd_tag (bd, initrd_start, initrd_end);
 #endif
-#if defined (CONFIG_VFD)
+#if defined (CONFIG_VFD) || defined (CONFIG_LCD)
        setup_videolfb_tag ((gd_t *) gd);
 #endif
        setup_end_tag (bd);
@@ -242,15 +258,25 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
        /* we assume that the kernel is in place */
        printf ("\nStarting kernel ...\n\n");
 
+#ifdef CONFIG_USB_DEVICE
+       {
+               extern void udc_disconnect (void);
+               udc_disconnect ();
+       }
+#endif
+
        cleanup_before_linux ();
 
-       theKernel (0, bd->bi_arch_number);
+       theKernel (0, bd->bi_arch_number, bd->bi_boot_params);
 }
 
 
 #if defined (CONFIG_SETUP_MEMORY_TAGS) || \
     defined (CONFIG_CMDLINE_TAG) || \
     defined (CONFIG_INITRD_TAG) || \
+    defined (CONFIG_SERIAL_TAG) || \
+    defined (CONFIG_REVISION_TAG) || \
+    defined (CONFIG_LCD) || \
     defined (CONFIG_VFD)
 static void setup_start_tag (bd_t *bd)
 {
@@ -289,6 +315,9 @@ static void setup_commandline_tag (bd_t *bd, char *commandline)
 {
        char *p;
 
+       if (!commandline)
+               return;
+
        /* eat leading white space */
        for (p = commandline; *p == ' '; p++);
 
@@ -308,10 +337,6 @@ static void setup_commandline_tag (bd_t *bd, char *commandline)
 }
 
 
-#ifndef ATAG_INITRD2
-#define ATAG_INITRD2    0x54420005
-#endif
-
 #ifdef CONFIG_INITRD_TAG
 static void setup_initrd_tag (bd_t *bd, ulong initrd_start, ulong initrd_end)
 {
@@ -329,7 +354,8 @@ static void setup_initrd_tag (bd_t *bd, ulong initrd_start, ulong initrd_end)
 #endif /* CONFIG_INITRD_TAG */
 
 
-#if defined (CONFIG_VFD)
+#if defined (CONFIG_VFD) || defined (CONFIG_LCD)
+extern ulong calc_fbsize (void);
 static void setup_videolfb_tag (gd_t *gd)
 {
        /* An ATAG_VIDEOLFB node tells the kernel where and how large
@@ -343,13 +369,46 @@ static void setup_videolfb_tag (gd_t *gd)
        params->hdr.size = tag_size (tag_videolfb);
 
        params->u.videolfb.lfb_base = (u32) gd->fb_base;
-       /* 7168 = 256*4*56/8 - actually 2 pages (8192 bytes) are allocated */
-       params->u.videolfb.lfb_size = 7168;
+       /* Fb size is calculated according to parameters for our panel
+        */
+       params->u.videolfb.lfb_size = calc_fbsize();
+
+       params = tag_next (params);
+}
+#endif /* CONFIG_VFD || CONFIG_LCD */
 
+#ifdef CONFIG_SERIAL_TAG
+void setup_serial_tag (struct tag **tmp)
+{
+       struct tag *params = *tmp;
+       struct tag_serialnr serialnr;
+       void get_board_serial(struct tag_serialnr *serialnr);
+
+       get_board_serial(&serialnr);
+       params->hdr.tag = ATAG_SERIAL;
+       params->hdr.size = tag_size (tag_serialnr);
+       params->u.serialnr.low = serialnr.low;
+       params->u.serialnr.high= serialnr.high;
        params = tag_next (params);
+       *tmp = params;
 }
 #endif
 
+#ifdef CONFIG_REVISION_TAG
+void setup_revision_tag(struct tag **in_params)
+{
+       u32 rev = 0;
+       u32 get_board_rev(void);
+
+       rev = get_board_rev();
+       params->hdr.tag = ATAG_REVISION;
+       params->hdr.size = tag_size (tag_revision);
+       params->u.revision.rev = rev;
+       params = tag_next (params);
+}
+#endif  /* CONFIG_REVISION_TAG */
+
+
 static void setup_end_tag (bd_t *bd)
 {
        params->hdr.tag = ATAG_NONE;