ifneq ($(arch-y),)
 SARCH := arch-$(arch-y)
-inc := -Iarch/cris/include/arch-$(arch-y) -Iarch/cris/include/arch-$(arch-y)/arch
+inc := -Iarch/cris/include/$(SARCH)
+inc += -Iarch/cris/include/$(SARCH)/arch
 else
 SARCH :=
 inc :=
 KBUILD_CFLAGS += -fno-omit-frame-pointer
 endif
 
-head-y := arch/$(ARCH)/$(SARCH)/kernel/head.o
+head-y := arch/cris/$(SARCH)/kernel/head.o
 
 LIBGCC = $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libgcc.a)
 
-core-y         += arch/$(ARCH)/kernel/ arch/$(ARCH)/mm/
-core-y         += arch/$(ARCH)/$(SARCH)/kernel/ arch/$(ARCH)/$(SARCH)/mm/
+core-y         += arch/cris/kernel/ arch/cris/mm/
+core-y         += arch/cris/$(SARCH)/kernel/ arch/cris/$(SARCH)/mm/
 ifdef CONFIG_ETRAX_ARCH_V32
-core-y         += arch/$(ARCH)/$(SARCH)/$(MACH)/
+core-y         += arch/cris/$(SARCH)/$(MACH)/
 endif
-drivers-y      += arch/$(ARCH)/$(SARCH)/drivers/
-libs-y         += arch/$(ARCH)/$(SARCH)/lib/ $(LIBGCC)
+drivers-y      += arch/cris/$(SARCH)/drivers/
+libs-y         += arch/cris/$(SARCH)/lib/ $(LIBGCC)
 
 # cris source path
-SRC_ARCH              = $(srctree)/arch/$(ARCH)
+SRC_ARCH              = $(srctree)/arch/cris
 # cris object files path
-OBJ_ARCH              = $(objtree)/arch/$(ARCH)
+OBJ_ARCH              = $(objtree)/arch/cris
 
-boot := arch/$(ARCH)/boot
-MACHINE := arch/$(ARCH)/$(SARCH)
+boot := arch/cris/$(SARCH)/boot
+MACHINE := arch/cris/$(SARCH)
 
 all: zImage
 
 zImage Image: vmlinux
        $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
 
-archprepare: $(SRC_ARCH)/.links FORCE
-
-# Create some links to make all tools happy
-$(SRC_ARCH)/.links:
-       @rm -rf $(SRC_ARCH)/drivers
-       @ln -sfn $(SARCH)/drivers $(SRC_ARCH)/drivers
-       @rm -rf $(SRC_ARCH)/boot
-       @ln -sfn $(SARCH)/boot $(SRC_ARCH)/boot
-       @rm -rf $(SRC_ARCH)/lib
-       @ln -sfn $(SARCH)/lib $(SRC_ARCH)/lib
-       @rm -f $(SRC_ARCH)/arch/mach
-       @rm -rf $(SRC_ARCH)/arch
-       @ln -sfn $(SARCH) $(SRC_ARCH)/arch
-ifdef CONFIG_ETRAX_ARCH_V32
-       @ln -sfn ../$(SARCH)/$(MACH) $(SRC_ARCH)/arch/mach
-endif
-       @rm -rf $(SRC_ARCH)/kernel/vmlinux.lds.S
-       @ln -sfn ../$(SARCH)/vmlinux.lds.S $(SRC_ARCH)/kernel/vmlinux.lds.S
-       @touch $@
+archprepare:
 
 archclean:
-       $(Q)if [ -e arch/$(ARCH)/boot ]; then \
-               $(MAKE) $(clean)=arch/$(ARCH)/boot; \
+       $(Q)if [ -e arch/cris/$(SARCH)/boot ]; then \
+               $(MAKE) $(clean)=arch/cris/$(SARCH)/boot; \
        fi
 
 CLEAN_FILES += \
        $(MACHINE)/boot/zImage \
        $(MACHINE)/boot/compressed/decompress.bin \
        $(MACHINE)/boot/compressed/piggy.gz \
-       $(MACHINE)/boot/rescue/rescue.bin \
-       $(SRC_ARCH)/.links
+       $(MACHINE)/boot/rescue/rescue.bin
 
-MRPROPER_FILES += \
-       $(SRC_ARCH)/drivers \
-       $(SRC_ARCH)/boot \
-       $(SRC_ARCH)/lib \
-       $(SRC_ARCH)/arch \
-       $(SRC_ARCH)/kernel/vmlinux.lds.S
 
+# MRPROPER_FILES +=
 
 define archhelp
-  echo  '* zImage        - Compressed kernel image (arch/$(ARCH)/boot/zImage)'
-  echo  '* Image         - Uncompressed kernel image (arch/$(ARCH)/boot/Image)'
+  echo  '* zImage        - Compressed kernel image (arch/cris/boot/zImage)'
+  echo  '* Image         - Uncompressed kernel image (arch/cris/boot/Image)'
 endef
 
+++ /dev/null
-/* ld script to make the Linux/CRIS kernel
- * Authors: Bjorn Wesen (bjornw@axis.com)
- *
- * It is VERY DANGEROUS to fiddle around with the symbols in this
- * script. It is for example quite vital that all generated sections
- * that are used are actually named here, otherwise the linker will
- * put them at the end, where the init stuff is which is FREED after
- * the kernel has booted. 
- */    
-
-#include <asm-generic/vmlinux.lds.h>
-#include <asm/page.h>
-
-jiffies = jiffies_64;
-SECTIONS
-{
-       . = DRAM_VIRTUAL_BASE;
-       dram_start = .;
-       ibr_start = .;
-       . = . + 0x4000; /* see head.S and pages reserved at the start */
-
-       _text = .;                    /* Text and read-only data */
-       text_start = .;              /* lots of aliases */
-       _stext = .;
-       __stext = .;
-       .text : {
-               TEXT_TEXT
-               SCHED_TEXT
-               LOCK_TEXT
-               *(.fixup)
-               *(.text.__*)
-       }
-
-       _etext = . ;                  /* End of text section */ 
-       __etext = .;
-
-       . = ALIGN(4);                /* Exception table */
-       __start___ex_table = .;
-       __ex_table : { *(__ex_table) }
-       __stop___ex_table = .;
-
-       RODATA
-
-       . = ALIGN (4);
-       ___data_start = . ;
-       __Sdata = . ;
-       .data : {                     /* Data */
-               DATA_DATA
-       }
-       __edata = . ;                 /* End of data section */
-       _edata = . ;
-
-       . = ALIGN(PAGE_SIZE);   /* init_task and stack, must be aligned */
-       .data.init_task : { *(.data.init_task) }
-
-       . = ALIGN(PAGE_SIZE);   /* Init code and data */
-       __init_begin = .;
-       .init.text : { 
-                  _sinittext = .;
-                  INIT_TEXT
-                  _einittext = .;
-       }
-       .init.data : { INIT_DATA }
-       . = ALIGN(16);
-       __setup_start = .;
-       .init.setup : { *(.init.setup) }
-       __setup_end = .;
-       .initcall.init : {
-               __initcall_start = .;
-               INITCALLS
-               __initcall_end = .;     
-       }
-
-       .con_initcall.init : {
-               __con_initcall_start = .;
-               *(.con_initcall.init)
-               __con_initcall_end = .;
-       }       
-       SECURITY_INIT
-
-#ifdef CONFIG_BLK_DEV_INITRD
-       .init.ramfs : {
-               __initramfs_start = .;
-               *(.init.ramfs)
-               __initramfs_end = .;
-       }
-#endif
-       __vmlinux_end = .;            /* last address of the physical file */
-
-       /*
-        * We fill to the next page, so we can discard all init
-        * pages without needing to consider what payload might be
-        * appended to the kernel image.
-        */
-       . = ALIGN(PAGE_SIZE);
-
-       __init_end = .;
-
-       __data_end = . ;              /* Move to _edata ? */
-       __bss_start = .;              /* BSS */
-       .bss : {
-               *(COMMON)
-               *(.bss)
-       }
-
-       . =  ALIGN (0x20);
-       _end = .;
-       __end = .;
-
-       /* Sections to be discarded */
-       /DISCARD/ : {
-               EXIT_TEXT
-               EXIT_DATA
-               *(.exitcall.exit)
-        }
-
-       dram_end = dram_start + CONFIG_ETRAX_DRAM_SIZE*1024*1024;
-}
 
        beq     dram_init_finished
        nop
 
-#include "../../mach/dram_init.S"
+#if defined CONFIG_ETRAXFS
+#include "../../mach-fs/dram_init.S"
+#elif defined CONFIG_CRIS_MACH_ARTPEC3
+#include "../../mach-a3/dram_init.S"
+#else
+#error Only ETRAXFS and ARTPEC-3 supported!
+#endif
 
 dram_init_finished:
 
 _boot_source:
        .dword 0
 
-#include "../../mach/hw_settings.S"
+#if defined CONFIG_ETRAXFS
+#include "../../mach-fs/hw_settings.S"
+#elif defined CONFIG_CRIS_MACH_ARTPEC3
+#include "../../mach-a3/hw_settings.S"
+#else
+#error Only ETRAXFS and ARTPEC-3 supported!
+#endif
 
  * The macros found in mmu_defs_asm.h uses the ## concatenation operator, so
  * -traditional must not be used when assembling this file.
  */
-#include <hwregs/reg_rdwr.h>
+#include <linux/autoconf.h>
 #include <arch/memmap.h>
+#include <hwregs/reg_rdwr.h>
 #include <hwregs/intr_vect.h>
 #include <hwregs/asm/mmu_defs_asm.h>
 #include <hwregs/asm/reg_map_asm.h>
        beq     _dram_initialized
        nop
 
-#include "../mach/dram_init.S"
+#if defined CONFIG_ETRAXFS
+#include "../mach-fs/dram_init.S"
+#elif defined CONFIG_CRIS_MACH_ARTPEC3
+#include "../mach-a3/dram_init.S"
+#else
+#error Only ETRAXFS and ARTPEC-3 supported!
+#endif
+
 
 _dram_initialized:
        ;; Copy the text and data section to DRAM. This depends on that the
 
        .section ".init.data", "aw"
 
-#include "../mach/hw_settings.S"
+#if defined CONFIG_ETRAXFS
+#include "../mach-fs/hw_settings.S"
+#elif defined CONFIG_CRIS_MACH_ARTPEC3
+#include "../mach-a3/hw_settings.S"
+#else
+#error Only ETRAXFS and ARTPEC-3 supported!
+#endif
 
  * the kernel has booted.
  */
 
+#include <linux/autoconf.h>
 #include <asm-generic/vmlinux.lds.h>
 #include <asm/page.h>
 
 #define __CONFIG_ETRAX_VMEM_SIZE 0
 #endif
 
+
 jiffies = jiffies_64;
 SECTIONS
 {
        . = DRAM_VIRTUAL_BASE;
        dram_start = .;
+#ifdef CONFIG_ETRAX_ARCH_V10
+       ibr_start = .;
+#else
        ebp_start = .;
-
        /* The boot section is only necessary until the VCS top */
        /* level testbench includes both flash and DRAM. */
        .boot : { *(.boot) }
+#endif
 
-       /* See head.S and pages reserved at the start. */
+       /* see head.S and pages reserved at the start */
        . = DRAM_VIRTUAL_BASE + 0x4000;
 
-       _text = .;              /* Text and read-only data. */
-       text_start = .;         /* Lots of aliases. */
+       _text = .;                      /* Text and read-only data. */
+       text_start = .;                 /* Lots of aliases. */
        _stext = .;
        __stext = .;
        .text : {
                *(.text.__*)
        }
 
-       _etext = . ;            /* End of text section. */
+       _etext = . ;                    /* End of text section. */
        __etext = .;
 
-       . = ALIGN(4);           /* Exception table. */
+       . = ALIGN(4);                   /* Exception table. */
        __start___ex_table = .;
        __ex_table : { *(__ex_table) }
        __stop___ex_table = .;
        . = ALIGN (4);
        ___data_start = . ;
        __Sdata = . ;
-       .data : {                     /* Data */
+       .data : {                       /* Data */
                DATA_DATA
        }
-       __edata = . ;           /* End of data section. */
+       __edata = . ;                   /* End of data section. */
        _edata = . ;
 
        . = ALIGN(PAGE_SIZE);   /* init_task and stack, must be aligned. */
        .data.init_task : { *(.data.init_task) }
 
-       . = ALIGN(PAGE_SIZE);   /* Init code and data. */
+       . = ALIGN(PAGE_SIZE);           /* Init code and data. */
        __init_begin = .;
        .init.text : {
                   _sinittext = .;
        __setup_start = .;
        .init.setup : { *(.init.setup) }
        __setup_end = .;
+#ifdef CONFIG_ETRAX_ARCH_V32
        __start___param = .;
        __param : { *(__param) }
        __stop___param = .;
+#endif
        .initcall.init : {
                __initcall_start = .;
                INITCALLS
        }
        SECURITY_INIT
 
-       __vmlinux_end = .;      /* Last address of the physical file. */
+#ifdef CONFIG_ETRAX_ARCH_V10
+#ifdef CONFIG_BLK_DEV_INITRD
+       .init.ramfs : {
+               __initramfs_start = .;
+               *(.init.ramfs)
+               __initramfs_end = .;
+       }
+#endif
+#endif
+       __vmlinux_end = .;              /* Last address of the physical file. */
+#ifdef CONFIG_ETRAX_ARCH_V32
        PERCPU(PAGE_SIZE)
 
        .init.ramfs : {
                *(.init.ramfs)
                __initramfs_end = .;
        }
+#endif
 
        /*
         * We fill to the next page, so we can discard all init
         * pages without needing to consider what payload might be
         * appended to the kernel image.
         */
-       . = ALIGN (PAGE_SIZE);
+       . = ALIGN(PAGE_SIZE);
 
        __init_end = .;
 
-       __data_end = . ;        /* Move to _edata? */
-       __bss_start = .;        /* BSS. */
+       __data_end = . ;                /* Move to _edata ? */
+       __bss_start = .;                /* BSS. */
        .bss : {
                *(COMMON)
                *(.bss)