DTC_FLAGS ?= -p 1024
 
 ifneq ($(DTB),)
-obj-y += linked_dtb.o
+obj-y += $(DTB).dtb.o
 endif
-
-quiet_cmd_cp = CP      $< $@$2
-       cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false)
-
-# Generate builtin.dtb from $(DTB).dtb
-$(obj)/builtin.dtb: $(obj)/$(DTB).dtb
-       $(call if_changed,cp)
-
-$(obj)/linked_dtb.o: $(obj)/builtin.dtb
 
+++ /dev/null
-.section __fdt_blob,"a"
-.incbin "arch/c6x/boot/dts/builtin.dtb"
 
 extern char _vectors_end[];
 
 extern char _data_lma[];
-extern char _fdt_start[], _fdt_end[];
 
 #endif /* _ASM_C6X_SECTIONS_H */
 
 notrace void __init machine_init(unsigned long dt_ptr)
 {
        void *dtb = __va(dt_ptr);
-       void *fdt = _fdt_start;
+       void *fdt = __dtb_start;
 
        /* interrupts must be masked */
        set_creg(IER, 2);
                                         memory_end >> PAGE_SHIFT);
        memblock_reserve(memory_start, bootmap_size);
 
-       unflatten_device_tree();
+       unflatten_and_copy_device_tree();
 
        c6x_cache_init();
 
 
                *(.switch)
        }
 
-       . = ALIGN (8) ;
-       __fdt_blob : AT(ADDR(__fdt_blob) - LOAD_OFFSET)
-       {
-               _fdt_start = . ;        /* place for fdt blob */
-               *(__fdt_blob) ;         /* Any link-placed DTB */
-               BYTE(0);                /* section always has contents */
-               . = _fdt_start + 0x4000;        /* Pad up to 16kbyte */
-               _fdt_end = . ;
-       }
-
        _etext = .;
 
        /*