--- device-tree-compiler-1.4.0+dfsg.orig/debian/README.Debian
+++ device-tree-compiler-1.4.0+dfsg/debian/README.Debian
@@ -0,0 +1,8 @@
+device-tree-compiler for Debian
+-------------------------------
+
+The original package is named dtc. However, there was already a
+dtc package in the archive. Therefore, we decided to rename dtc to
+device-tree-compiler.
+
+ -- Aurélien GÉRÔME <ag@roxor.cx>  Sat,  3 Mar 2007 23:13:14 +0100
--- device-tree-compiler-1.4.0+dfsg.orig/debian/README.source
+++ device-tree-compiler-1.4.0+dfsg/debian/README.source
@@ -0,0 +1,2 @@
+The patch system used in this package is quilt based.
+Refer to /usr/share/doc/quilt/README.source for further information.
--- device-tree-compiler-1.4.0+dfsg.orig/debian/changelog
+++ device-tree-compiler-1.4.0+dfsg/debian/changelog
@@ -0,0 +1,108 @@
+device-tree-compiler (1.4.0+dfsg-1) precise; urgency=low
+
+  * REALLY update to upstream version 1.4.0, closes: #725745
+
+ -- Riku Voipio <riku.voipio@linaro.org>  Fri, 03 Jan 2014 16:22:27 +0200
+
+device-tree-compiler (1.4.0-2) unstable; urgency=low
+
+  * Convert to multiarch
+
+ -- Riku Voipio <riku.voipio@linaro.org>  Fri, 23 Aug 2013 14:58:19 +0300
+
+device-tree-compiler (1.4.0-1) unstable; urgency=low
+
+  * Added myself to maintainers
+  * New upstream version, closes: #713991
+
+ -- Riku Voipio <riku.voipio@linaro.org>  Mon, 12 Aug 2013 15:36:00 +0300
+
+device-tree-compiler (1.3.0-4) unstable; urgency=low
+
+  * Revert accidental source format change.
+
+ -- Hector Oron <zumbi@pergolesi.debian.org>  Sat, 27 Apr 2013 09:59:06 +0000
+
+device-tree-compiler (1.3.0-3) unstable; urgency=low
+
+  * libfdt-dev: Missing header file prevents the library usage
+    Thanks Domenico Andreoli (Closes: #706137)
+
+ -- Hector Oron <zumbi@debian.org>  Sat, 27 Apr 2013 07:47:09 +0000
+
+device-tree-compiler (1.3.0-2) unstable; urgency=low
+
+  * Add libfdt package (Closes: #477565)
+    - Thanks Dmitry Eremin-Solenikov and Aurelien Jarno for patch.
+  * Backport upstream fixes as patches until 2012-1-21.
+  * Reword package description to generalize architecture support.
+    - Removes OpenFirmware and PowerPC references.
+  * Update dtc manpage and include fdtget, fdtput, fdtdump, convert-dtsv0,
+    dtdiff manpages.
+  * d/rules: Add build-arch and build-indep targets.
+  * d/README.source: refer to quilt patching system.
+  * Remove Apps top-level section from doc-base.
+
+ -- Hector Oron <zumbi@debian.org>  Sat, 28 Jan 2012 01:16:09 +0100
+
+device-tree-compiler (1.3.0-1) unstable; urgency=low
+
+  * New upstream release. (Closes: #572945)
+  * New maintainer. (Closes: #649290)
+  * New VCS repository.
+  * Update homepage stanza (Closes: #497605)
+  * Update standards version.
+  * Compile with -fPIC. Fixes ftbfs on amd64.
+  * Use dpkg 1.0 format.
+  * Backport upstream fixes as patches until 2011-10-26.
+
+ -- Hector Oron <zumbi@debian.org>  Tue, 22 Nov 2011 12:23:38 +0000
+
+device-tree-compiler (1.1.0.dfsg-1) unstable; urgency=low
+
+  * New upstream release.
+  * Fix lintian warning "copyright-without-copyright-notice".
+    + Update debian/copyright.
+
+ -- Aurélien GÉRÔME <ag@roxor.cx>  Sat, 16 Feb 2008 17:08:36 +0100
+
+device-tree-compiler (1.0.0.dfsg-1) unstable; urgency=low
+
+  * New upstream release. (Closes: #438479)
+    + Fix missing /chosen node, as it has been removed from DTS.
+      (Closes: #436234)
+  * Remove ftdump from the upstream tarball.
+    + This file has no license notice.
+    + Fix conflict with the freetype2-demos package. (Closes: #434890)
+    + David Gibson told me that he would not bother even installing
+      ftdump. It was meant to be a debugging tool, dumping a blob
+      back into text format, but it never got very far and he has
+      been meaning to get rid of it.
+  * Update tests/dumptrees.c in the upstream tarball with GIT commit
+    08c0be206d5d6b035db11048d19be33216332f2b.
+    + Fix missing copyright and license notices.
+  * Update debian/copyright.
+    + Mention dual GPLv2+/BSD licensing of libfdt.
+    + Add Jon Loeliger as an upstream author.
+  * Bump Standards-Version to 3.7.3.
+  * Add the Homepage field and remove it from the long description.
+  * Add the Vcs-Git/Vcs-Browser fields.
+  * Add the XS-DM-Upload-Allowed field.
+  * Rewrite short and long descriptions in debian/control.
+  * Rewrite debian/rules to handle the noopt build option.
+  * Write and add a manpage for dtc.
+  * Add documentation under /usr/share/doc/device-tree-compiler/.
+    + Add Build-Depends on texlive and texlive-latex-extra.
+    + Add debian/doc-base.dtc-manual and debian/doc-base.dtc-paper.
+    + Create a Makefile to build dtc-paper.tex.
+      - Add quilt support to build system.
+      - Add 01_build_doc.diff.
+    + Update debian/rules to prepare documentation.
+
+ -- Aurélien GÉRÔME <ag@roxor.cx>  Sat, 22 Dec 2007 04:02:24 +0100
+
+device-tree-compiler (0.1~git20070226-1) experimental; urgency=low
+
+  * Initial release. (Closes: #413290)
+
+ -- Aurélien GÉRÔME <ag@roxor.cx>  Sat,  3 Mar 2007 23:13:14 +0100
--- device-tree-compiler-1.4.0+dfsg.orig/debian/compat
+++ device-tree-compiler-1.4.0+dfsg/debian/compat
@@ -0,0 +1 @@
+5
--- device-tree-compiler-1.4.0+dfsg.orig/debian/control
+++ device-tree-compiler-1.4.0+dfsg/debian/control
@@ -0,0 +1,40 @@
+Source: device-tree-compiler
+Section: devel
+Priority: extra
+Maintainer: Hector Oron <zumbi@debian.org>
+Uploaders: Riku Voipio <riku.voipio@linaro.org>
+Standards-Version: 3.9.5
+Build-Depends: debhelper (>= 5), quilt, flex, bison, texlive, texlive-latex-extra
+Homepage: http://git.jdl.com/gitweb/?p=dtc.git
+Vcs-Git: git://anonscm.debian.org/crosstoolchain/device-tree-compiler.git
+Vcs-Browser: http://anonscm.debian.org/gitweb/?p=crosstoolchain/device-tree-compiler.git
+
+Package: device-tree-compiler
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Multi-Arch: foreign
+Description: Device Tree Compiler for Flat Device Trees
+ Device Tree Compiler, dtc, takes as input a device-tree in
+ a given format and outputs a device-tree in another format
+ for booting kernels on embedded systems.
+ .
+ Typically, the input format is "dts", a human readable source
+ format, and creates a "dtb", or binary format as output.
+
+Package: libfdt1
+Architecture: any
+Section: libs
+Multi-Arch: same
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Pre-Depends: multiarch-support
+Description: Flat Device Trees manipulation library
+ This is a library containing functions for manipulating Flat Device Trees.
+
+Package: libfdt-dev
+Architecture: any
+Section: libdevel
+Depends: libfdt1 (= ${binary:Version}), ${misc:Depends}
+Description: Flat Device Trees manipulation library - development files
+ This is a library containing functions for manipulating Flat Device Trees.
+ .
+ This package contains the files needed for development against libfdt.
--- device-tree-compiler-1.4.0+dfsg.orig/debian/copyright
+++ device-tree-compiler-1.4.0+dfsg/debian/copyright
@@ -0,0 +1,91 @@
+This package was debianized by Aurélien GÉRÔME <ag@roxor.cx> on
+Sat,  3 Mar 2007 23:13:14 +0100.
+
+It was checked out from <git://www.jdl.com/software/dtc.git>.
+
+Upstream Authors:
+
+  David Gibson <david@gibson.dropbear.id.au>
+  Jon Loeliger <jdl@freescale.com>
+
+Copyright notices:
+
+  Copyright 2005-2007 David Gibson, IBM Corporation.
+  Copyright 2007 Jon Loeliger, Freescale Semiconductor, Inc.
+
+Licenses:
+
+  dtc code:
+
+/*
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
+ *  USA.
+ */
+
+  libfdt code:
+
+/*
+ * libfdt - Flat Device Tree manipulation
+ *
+ * libfdt is dual licensed: you can use it either under the terms of
+ * the GPL, or the BSD license, at your option.
+ *
+ *  a) This library 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 library 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 library; if not, write to the Free
+ *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ *     MA 02110-1301 USA
+ *
+ * Alternatively,
+ *
+ *  b) Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *     2. Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+The Debian packaging is (C) 2007, Aurélien GÉRÔME <ag@roxor.cx> and
+is licensed under the GPL, see `/usr/share/common-licenses/GPL'.
--- device-tree-compiler-1.4.0+dfsg.orig/debian/device-tree-compiler.install
+++ device-tree-compiler-1.4.0+dfsg/debian/device-tree-compiler.install
@@ -0,0 +1 @@
+usr/bin/*
--- device-tree-compiler-1.4.0+dfsg.orig/debian/dirs
+++ device-tree-compiler-1.4.0+dfsg/debian/dirs
@@ -0,0 +1 @@
+usr/bin
--- device-tree-compiler-1.4.0+dfsg.orig/debian/doc-base.dtc-manual
+++ device-tree-compiler-1.4.0+dfsg/debian/doc-base.dtc-manual
@@ -0,0 +1,10 @@
+Document: dtc-manual
+Title: Device Tree Compiler Manual
+Author: Jon Loeliger
+Abstract: This manual is derived from the kernel documentation
+ /usr/share/doc/linux-doc-<version>/Documentation/powerpc/booting-without-of.txt.gz
+ which is now out of date.
+Section: Programming
+
+Format: Text
+Files: /usr/share/doc/device-tree-compiler/dtc-manual.txt.gz
--- device-tree-compiler-1.4.0+dfsg.orig/debian/doc-base.dtc-paper
+++ device-tree-compiler-1.4.0+dfsg/debian/doc-base.dtc-paper
@@ -0,0 +1,15 @@
+Document: dtc-paper
+Title: Device trees everywhere
+Author: David Gibson, Benjamin Herrenschmidt 
+Abstract: This paper presents a method for booting a PowerPC Linux
+ kernel on an embedded machine.
+Section: Programming
+
+Format: PDF
+Files: /usr/share/doc/device-tree-compiler/dtc-paper.pdf.gz
+
+Format: PostScript
+Files: /usr/share/doc/device-tree-compiler/dtc-paper.ps.gz
+
+Format: DVI
+Files: /usr/share/doc/device-tree-compiler/dtc-paper.dvi.gz
--- device-tree-compiler-1.4.0+dfsg.orig/debian/libfdt-dev.install
+++ device-tree-compiler-1.4.0+dfsg/debian/libfdt-dev.install
@@ -0,0 +1,3 @@
+usr/include/*
+usr/lib/*/libfdt.a
+usr/lib/*/libfdt.so
--- device-tree-compiler-1.4.0+dfsg.orig/debian/libfdt1.install
+++ device-tree-compiler-1.4.0+dfsg/debian/libfdt1.install
@@ -0,0 +1,2 @@
+usr/lib/*/libfdt-*.so
+usr/lib/*/libfdt.so.*
--- device-tree-compiler-1.4.0+dfsg.orig/debian/manpages/convert-dtsv0.1
+++ device-tree-compiler-1.4.0+dfsg/debian/manpages/convert-dtsv0.1
@@ -0,0 +1,22 @@
+.TH DTC 1 "30 January 2012" "Linux"
+.SH NAME
+\fBconvert-dtsv0\fP \- Device Tree Compiler -- Conversion to Version 1
+.SH SYNOPSIS
+\fB/usr/bin/convert-dtsv0\fP [<input_filename ... >]
+.SH DESCRIPTION
+convert-dtsv0 is a small utility program which converts (DTS)
+
+Device Tree Source from the obsolete version 0 to version 1.
+Version 1 DTS files are marked by line "/dts-v1/;" at the top of the file.
+
+Each file passed will be converted to the new /dts-v1/ version by creating
+a new file with a "v1" appended the filename.
+
+Comments, empty lines, etc. are preserved.
+.SH AUTHOR
+\fBconvert-dtsv0\fP was written by David Gibson
+<david@gibson.dropbear.id.au>. Since April 1, 2006, Jon Loeliger
+<jdl@jdl.com> assumes maintainership.
+.PP
+This manual page was written by H\['e]ctor Or\['o]n
+<zumbi@debian.org>, for the Debian project (but may be used by others).
--- device-tree-compiler-1.4.0+dfsg.orig/debian/manpages/dtc.1
+++ device-tree-compiler-1.4.0+dfsg/debian/manpages/dtc.1
@@ -0,0 +1,103 @@
+.TH DTC 1 "30 January 2012" "Linux"
+.SH NAME
+\fBdtc\fP \- Device Tree Compiler
+.SH SYNOPSIS
+\fB/usr/bin/dtc\fP [options] <input file>
+.SH DESCRIPTION
+Device Tree Compiler, dtc, takes as input a device-tree in
+a given format and outputs a device-tree in another format
+for booting kernels on embedded systems.
+Typically, the input format is "dts", a human readable source
+format, and creates a "dtb", or binary format as output.
+.SH OPTIONS
+.TP
+\fB\-h\fR
+Display help text.
+.TP
+\fB\-q\fR
+Quiet:
+.IP
+\fB-q\fR \- Suppress warnings.
+.br
+\fB-qq\fR \- Suppress errors.
+.br
+\fB-qqq\fR \- Suppress all.
+.TP
+\fB\-I\fR <input format>
+.IP
+Input formats are:
+.IP
+\fBdts\fR \- device tree source text
+.br
+\fBdtb\fR \- device tree blob
+.br
+\fBfs\fR \- /proc/device\-tree style directory
+.TP
+\fB\-o\fR <output file>
+.IP
+Dump the result into a file, instead of stdout.
+.TP
+\fB\-O\fR <output format>
+.IP
+Output formats are:
+.IP
+\fBdts\fR \- device tree source text
+.br
+\fBdtb\fR \- device tree blob
+.br
+\fBasm\fR \- assembler source
+.TP
+\fB\-V\fR <output version>
+.IP
+Blob version to produce. The default is 17 (only relevant for dtb
+and asm output).
+.TP
+\fB\-d\fR <output dependency file>
+.TP
+\fB\-R\fR <number>
+.IP
+Make space for <number> reserve map entries (only relevant for dtb
+and asm output).
+.TP
+\fB\-S\fR <bytes>
+.IP
+Make the blob at least <bytes> long (extra space).
+.TP
+\fB\-p\fR <bytes>
+.IP
+Add padding to the blob of <bytes> long (extra space)
+.HP
+\fB\-b\fR <number>
+.IP
+Set the physical boot CPU.
+.TP
+\fB\-f\fR
+.IP
+Force \- try to produce output even if the input tree has errors.
+.TP
+\fB\-s\fR
+.IP
+Sort nodes and properties before outputting (only useful for comparing trees)
+.TP
+\fB\-v\fR
+Print DTC version and exit.
+.TP
+\fB\-H\fR <phandle format>
+.IP
+phandle formats are:
+.IP
+\fBlegacy\fR \- "linux,phandle" properties only
+.br
+\fBepapr\fR \- "phandle" properties only
+.br
+\fBboth\fR \- Both "linux,phandle" and "phandle" properties
+.SH AUTHOR
+\fBdtc\fP was written by David Gibson
+<david@gibson.dropbear.id.au>. Since April 1, 2006, Jon Loeliger
+<jdl@jdl.com> assumes maintainership.
+.PP
+This manual page was originally written by Aur\['e]lien G\['E]R\[^O]ME
+<ag@roxor.cx>, for the Debian project (but may be used by others).
+.PP
+This manual page is currently maintained and update it by H\['e]ctor Or\['o]n
+<zumbi@debian.org>, for the Debian project.
--- device-tree-compiler-1.4.0+dfsg.orig/debian/manpages/dtdiff.1
+++ device-tree-compiler-1.4.0+dfsg/debian/manpages/dtdiff.1
@@ -0,0 +1,14 @@
+.TH DTC 1 "30 January 2012" "Linux"
+.SH NAME
+\fBdtdiff\fP \- compare two different device-tree
+.SH SYNOPSIS
+\fB/usr/bin/dtdiff\fP <device tree> <device tree>
+.SH DESCRIPTION
+Compares two different device-tree.
+.SH AUTHOR
+\fBdtc\fP was written by David Gibson
+<david@gibson.dropbear.id.au>. Since April 1, 2006, Jon Loeliger
+<jdl@jdl.com> assumes maintainership.
+.PP
+This manual page was written by H\['e]ctor Or\['o]n
+<zumbi@debian.org>, for the Debian project (but may be used by others).
--- device-tree-compiler-1.4.0+dfsg.orig/debian/manpages/fdtdump.1
+++ device-tree-compiler-1.4.0+dfsg/debian/manpages/fdtdump.1
@@ -0,0 +1,13 @@
+.TH DTC 1 "30 January 2012" "Linux"
+.SH NAME
+\fBfdtdump\fP \- prints a readable version of a flat device-tree file.
+.SH SYNOPSIS
+\fB/usr/bin/fdtdump\fP <DTB-file-name>
+.SH DESCRIPTION
+The fdtdump program prints a readable version of a flat device-tree file.
+.SH AUTHOR
+\fBfdtdump\fP was written by Pantelis Antoniou
+<pantelis.antoniou AT gmail.com>.
+.PP
+This manual page was written by H\['e]ctor Or\['o]n
+<zumbi@debian.org>, for the Debian project (but may be used by others).
--- device-tree-compiler-1.4.0+dfsg.orig/debian/manpages/fdtget.1
+++ device-tree-compiler-1.4.0+dfsg/debian/manpages/fdtget.1
@@ -0,0 +1,25 @@
+.TH DTC 1 "30 January 2012" "Linux"
+.SH NAME
+\fBfdtget\fP \- read values from device-tree
+.SH SYNOPSIS
+\fB/usr/bin/fdtget\fP <options> <dt file> [<node> <property>]...
+.SH DESCRIPTION
+Read values from device-tree. Each value is printed on a new line.
+.SH OPTIONS
+.TP
+\fB\-h\fR
+Print this help.
+.TP
+\fB\-t\fR <type>
+Type of data
+.IP
+<type>  s=string, i=int, u=unsigned, x=hex
+.br
+Optional modifier prefix:
+.br
+hh or b=byte, h=2 byte, l=4 byte (default)
+.SH AUTHOR
+\fBfdtget\fP was written by The Chromium OS Authors.
+.PP
+This manual page was written by H\['e]ctor Or\['o]n
+<zumbi@debian.org>, for the Debian project (but may be used by others).
--- device-tree-compiler-1.4.0+dfsg.orig/debian/manpages/fdtput.1
+++ device-tree-compiler-1.4.0+dfsg/debian/manpages/fdtput.1
@@ -0,0 +1,29 @@
+.TH DTC 1 "30 January 2012" "Linux"
+.SH NAME
+\fBfdtput\fP \- write a property value to a device-tree
+.SH SYNOPSIS
+\fB/usr/bin/fdtput\fP <options> <dt file> <<node> <property> [<value>...]
+.SH DESCRIPTION
+Write a property value to a device-tree. The command line arguments are
+joined together into a single value.
+.SH OPTIONS
+.TP
+\fB\-h\fR
+Print this help.
+.TP
+\fB\-v\fR
+Verbose: display each value decoded from command line
+.TP
+\fB\-t\fR <type>
+Type of data
+.IP
+<type>  s=string, i=int, u=unsigned, x=hex
+.br
+Optional modifier prefix:
+.br
+hh or b=byte, h=2 byte, l=4 byte (default)
+.SH AUTHOR
+\fBfdtput\fP was written by The Chromium OS Authors.
+.PP
+This manual page was written by H\['e]ctor Or\['o]n
+<zumbi@debian.org>, for the Debian project (but may be used by others).
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/01_build_doc.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/01_build_doc.patch
@@ -0,0 +1,21 @@
+Index: device-tree-compiler-1.0.0/Documentation/Makefile
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ device-tree-compiler-1.0.0/Documentation/Makefile	2007-08-23 18:26:22.000000000 +0200
+@@ -0,0 +1,16 @@
++all: dtc-paper.ps dtc-paper.pdf dtc-manual.txt
++
++dtc-manual.txt: manual.txt
++	cp -f $< $@
++
++dtc-paper.dvi: dtc-paper.tex
++	latex $<
++
++dtc-paper.ps: dtc-paper.dvi
++	dvips $<
++
++dtc-paper.pdf: dtc-paper.tex
++	pdflatex $<
++
++clean:
++	rm -f *.aux *.log *.dvi *.ps *.pdf dtc-manual.txt
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/02_remove-unused-check-variable.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/02_remove-unused-check-variable.patch
@@ -0,0 +1,55 @@
+From: Josh Boyer <jwboyer@linux.vnet.ibm.com>
+Date: Tue, 28 Jun 2011 12:47:09 +0000 (-0400)
+Subject: dtc: Remove unused check variable
+X-Git-Url: http://git.jdl.com/gitweb/?p=dtc.git;a=commitdiff_plain;h=0a5aca98ba104ec4101322ccaf36da45064ad3ce
+
+dtc: Remove unused check variable
+
+Commit 376ab6f2 removed the old style check functionality from DTC,
+however the check option and variable were not removed.  This leads to
+build failures when -Werror=unused-but-set-variable is specified:
+
+	dtc.c: In function 'main':
+	dtc.c:102:17: error: variable 'check' set but not used [-Werror=unused-but-set-variable]
+	cc1: all warnings being treated as errors
+	make: *** [dtc.o] Error 1
+	make: *** Waiting for unfinished jobs....
+
+Remove the check variable.
+
+Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
+Acked-by: David Gibson <david@gibson.dropbear.id.au>
+---
+
+diff --git a/dtc.c b/dtc.c
+index cbc0193..15d2fc2 100644
+--- a/dtc.c
++++ b/dtc.c
+@@ -99,7 +99,7 @@ int main(int argc, char *argv[])
+ 	const char *inform = "dts";
+ 	const char *outform = "dts";
+ 	const char *outname = "-";
+-	int force = 0, check = 0, sort = 0;
++	int force = 0, sort = 0;
+ 	const char *arg;
+ 	int opt;
+ 	FILE *outf = NULL;
+@@ -111,7 +111,7 @@ int main(int argc, char *argv[])
+ 	minsize    = 0;
+ 	padsize    = 0;
+ 
+-	while ((opt = getopt(argc, argv, "hI:O:o:V:R:S:p:fcqb:vH:s")) != EOF) {
++	while ((opt = getopt(argc, argv, "hI:O:o:V:R:S:p:fqb:vH:s")) != EOF) {
+ 		switch (opt) {
+ 		case 'I':
+ 			inform = optarg;
+@@ -137,9 +137,6 @@ int main(int argc, char *argv[])
+ 		case 'f':
+ 			force = 1;
+ 			break;
+-		case 'c':
+-			check = 1;
+-			break;
+ 		case 'q':
+ 			quiet++;
+ 			break;
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/03_Remove-unused-variable-in-flat_read_mem_reserve.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/03_Remove-unused-variable-in-flat_read_mem_reserve.patch
@@ -0,0 +1,42 @@
+From: Josh Boyer <jwboyer@linux.vnet.ibm.com>
+Date: Tue, 28 Jun 2011 13:47:11 +0000 (-0400)
+Subject: dtc: Remove unused variable in flat_read_mem_reserve
+X-Git-Url: http://git.jdl.com/gitweb/?p=dtc.git;a=commitdiff_plain;h=d5b3165023b1cc3914e9943b91964ec9ad4be8b2
+
+dtc: Remove unused variable in flat_read_mem_reserve
+
+The *p variable is declared and used to save inb->ptr, however p is
+later never used.  This has been the case since commit 6c0f3676 and can
+lead to build failures with -Werror=unused-but-set-variable:
+
+	flattree.c: In function 'flat_read_mem_reserve':
+	flattree.c:700:14: error: variable 'p' set but not used [-Werror=unused-but-set-variable]
+	cc1: all warnings being treated as errors
+	make: *** [flattree.o] Error 1
+
+Remove the variable.
+
+Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
+Acked-by: David Gibson <david@gibson.dropbear.id.au>
+---
+
+diff --git a/flattree.c b/flattree.c
+index ead0332..28d0b23 100644
+--- a/flattree.c
++++ b/flattree.c
+@@ -697,7 +697,6 @@ static struct reserve_info *flat_read_mem_reserve(struct inbuf *inb)
+ {
+ 	struct reserve_info *reservelist = NULL;
+ 	struct reserve_info *new;
+-	const char *p;
+ 	struct fdt_reserve_entry re;
+ 
+ 	/*
+@@ -706,7 +705,6 @@ static struct reserve_info *flat_read_mem_reserve(struct inbuf *inb)
+ 	 *
+ 	 * First pass, count entries.
+ 	 */
+-	p = inb->ptr;
+ 	while (1) {
+ 		flat_read_chunk(inb, &re, sizeof(re));
+ 		re.address  = fdt64_to_cpu(re.address);
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/04_Split-out-is_printable_string-into-util.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/04_Split-out-is_printable_string-into-util.patch
@@ -0,0 +1,157 @@
+From: Simon Glass <sjg@chromium.org>
+Date: Tue, 5 Jul 2011 19:02:49 +0000 (-0700)
+Subject: Split out is_printable_string() into util.c
+X-Git-Url: http://git.jdl.com/gitweb/?p=dtc.git;a=commitdiff_plain;h=492f9d5de7db74aeb3a905246c4efd7cb29227a8
+
+Split out is_printable_string() into util.c
+
+This useful function is split out so it will be available to programs
+other than ftdump.
+
+Signed-off-by: Simon Glass <sjg@chromium.org>
+Acked-by: David Gibson <david@gibson.dropbear.id.au>
+---
+
+diff --git a/Makefile.ftdump b/Makefile.ftdump
+index b70905a..2744a18 100644
+--- a/Makefile.ftdump
++++ b/Makefile.ftdump
+@@ -5,7 +5,8 @@
+ #
+ 
+ FTDUMP_SRCS = \
+-	ftdump.c
++	ftdump.c \
++	util.c
+ 
+ FTDUMP_GEN_SRCS =
+ 
+diff --git a/ftdump.c b/ftdump.c
+index bce6535..db932e3 100644
+--- a/ftdump.c
++++ b/ftdump.c
+@@ -11,36 +11,14 @@
+ #include <fdt.h>
+ #include <libfdt_env.h>
+ 
++#include "util.h"
++
+ #define FTDUMP_BUF_SIZE	65536
+ 
+ #define ALIGN(x, a)	(((x) + ((a) - 1)) & ~((a) - 1))
+ #define PALIGN(p, a)	((void *)(ALIGN((unsigned long)(p), (a))))
+ #define GET_CELL(p)	(p += 4, *((const uint32_t *)(p-4)))
+ 
+-static int is_printable_string(const void *data, int len)
+-{
+-	const char *s = data;
+-	const char *ss;
+-
+-	/* zero length is not */
+-	if (len == 0)
+-		return 0;
+-
+-	/* must terminate with zero */
+-	if (s[len - 1] != '\0')
+-		return 0;
+-
+-	ss = s;
+-	while (*s && isprint(*s))
+-		s++;
+-
+-	/* not zero, or not done yet */
+-	if (*s != '\0' || (s + 1 - ss) < len)
+-		return 0;
+-
+-	return 1;
+-}
+-
+ static void print_data(const char *data, int len)
+ {
+ 	int i;
+@@ -50,7 +28,7 @@ static void print_data(const char *data, int len)
+ 	if (len == 0)
+ 		return;
+ 
+-	if (is_printable_string(data, len)) {
++	if (util_is_printable_string(data, len)) {
+ 		printf(" = \"%s\"", (const char *)data);
+ 	} else if ((len % 4) == 0) {
+ 		printf(" = <");
+diff --git a/util.c b/util.c
+index d7ac27d..994436f 100644
+--- a/util.c
++++ b/util.c
+@@ -1,6 +1,9 @@
+ /*
+  * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc.
+  *
++ * util_is_printable_string contributed by
++ *	Pantelis Antoniou <pantelis.antoniou AT gmail.com>
++ *
+  * 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
+@@ -17,6 +20,7 @@
+  *                                                                   USA
+  */
+ 
++#include <ctype.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <stdarg.h>
+@@ -57,3 +61,27 @@ char *join_path(const char *path, const char *name)
+ 	memcpy(str+lenp, name, lenn+1);
+ 	return str;
+ }
++
++int util_is_printable_string(const void *data, int len)
++{
++	const char *s = data;
++	const char *ss;
++
++	/* zero length is not */
++	if (len == 0)
++		return 0;
++
++	/* must terminate with zero */
++	if (s[len - 1] != '\0')
++		return 0;
++
++	ss = s;
++	while (*s && isprint(*s))
++		s++;
++
++	/* not zero, or not done yet */
++	if (*s != '\0' || (s + 1 - ss) < len)
++		return 0;
++
++	return 1;
++}
+diff --git a/util.h b/util.h
+index 9cead84..cc68933 100644
+--- a/util.h
++++ b/util.h
+@@ -1,6 +1,8 @@
+ #ifndef _UTIL_H
+ #define _UTIL_H
+ 
++#include <stdarg.h>
++
+ /*
+  * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc.
+  *
+@@ -53,4 +55,13 @@ static inline void *xrealloc(void *p, size_t len)
+ extern char *xstrdup(const char *s);
+ extern char *join_path(const char *path, const char *name);
+ 
++/**
++ * Check a string of a given length to see if it is all printable and
++ * has a valid terminator.
++ *
++ * @param data	The string to check
++ * @param len	The string length including terminator
++ * @return 1 if a valid printable string, 0 if not */
++int util_is_printable_string(const void *data, int len);
++
+ #endif /* _UTIL_H */
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/05_Add-missing-tests-to-gitignore.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/05_Add-missing-tests-to-gitignore.patch
@@ -0,0 +1,21 @@
+From: Simon Glass <sjg@chromium.org>
+Date: Tue, 5 Jul 2011 19:02:52 +0000 (-0700)
+Subject: Add missing tests to .gitignore
+X-Git-Url: http://git.jdl.com/gitweb/?p=dtc.git;a=commitdiff_plain;h=ed8fee1a649b5430afc9b551e3bb6746ebe32449
+
+Add missing tests to .gitignore
+
+Signed-off-by: Simon Glass <sjg@chromium.org>
+Acked-by: David Gibson <david@gibson.dropbear.id.au>
+---
+
+diff --git a/tests/.gitignore b/tests/.gitignore
+index c4e1205..f4e58b2 100644
+--- a/tests/.gitignore
++++ b/tests/.gitignore
+@@ -45,3 +45,5 @@
+ /sw_tree1
+ /truncated_property
+ /value-labels
++/dtb_reverse
++/dtbs_equal_unordered
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/06_Refactor-character-literal-parsing-code.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/06_Refactor-character-literal-parsing-code.patch
@@ -0,0 +1,249 @@
+From: Anton Staaf <robotboy@chromium.org>
+Date: Fri, 9 Sep 2011 19:16:29 +0000 (-0700)
+Subject: dtc: Refactor character literal parsing code
+X-Git-Url: http://git.jdl.com/gitweb/?p=dtc.git;a=commitdiff_plain;h=b43335a23854b2620140eda6cca2ffae59e8de23
+
+dtc: Refactor character literal parsing code
+
+Move the parsing of hex, octal and escaped characters from data.c
+to util.c where it can be used for character literal parsing within
+strings as well as for stand alone C style character literals.
+
+Signed-off-by: Anton Staaf <robotboy@chromium.org>
+Acked-by: David Gibson <david@gibson.dropbear.id.au>
+---
+
+diff --git a/data.c b/data.c
+index fe555e8..b5f3066 100644
+--- a/data.c
++++ b/data.c
+@@ -68,40 +68,6 @@ struct data data_copy_mem(const char *mem, int len)
+ 	return d;
+ }
+ 
+-static char get_oct_char(const char *s, int *i)
+-{
+-	char x[4];
+-	char *endx;
+-	long val;
+-
+-	x[3] = '\0';
+-	strncpy(x, s + *i, 3);
+-
+-	val = strtol(x, &endx, 8);
+-
+-	assert(endx > x);
+-
+-	(*i) += endx - x;
+-	return val;
+-}
+-
+-static char get_hex_char(const char *s, int *i)
+-{
+-	char x[3];
+-	char *endx;
+-	long val;
+-
+-	x[2] = '\0';
+-	strncpy(x, s + *i, 2);
+-
+-	val = strtol(x, &endx, 16);
+-	if (!(endx  > x))
+-		die("\\x used with no following hex digits\n");
+-
+-	(*i) += endx - x;
+-	return val;
+-}
+-
+ struct data data_copy_escape_string(const char *s, int len)
+ {
+ 	int i = 0;
+@@ -114,53 +80,10 @@ struct data data_copy_escape_string(const char *s, int len)
+ 	while (i < len) {
+ 		char c = s[i++];
+ 
+-		if (c != '\\') {
+-			q[d.len++] = c;
+-			continue;
+-		}
+-
+-		c = s[i++];
+-		assert(c);
+-		switch (c) {
+-		case 'a':
+-			q[d.len++] = '\a';
+-			break;
+-		case 'b':
+-			q[d.len++] = '\b';
+-			break;
+-		case 't':
+-			q[d.len++] = '\t';
+-			break;
+-		case 'n':
+-			q[d.len++] = '\n';
+-			break;
+-		case 'v':
+-			q[d.len++] = '\v';
+-			break;
+-		case 'f':
+-			q[d.len++] = '\f';
+-			break;
+-		case 'r':
+-			q[d.len++] = '\r';
+-			break;
+-		case '0':
+-		case '1':
+-		case '2':
+-		case '3':
+-		case '4':
+-		case '5':
+-		case '6':
+-		case '7':
+-			i--; /* need to re-read the first digit as
+-			      * part of the octal value */
+-			q[d.len++] = get_oct_char(s, &i);
+-			break;
+-		case 'x':
+-			q[d.len++] = get_hex_char(s, &i);
+-			break;
+-		default:
+-			q[d.len++] = c;
+-		}
++		if (c == '\\')
++			c = get_escape_char(s, &i);
++
++		q[d.len++] = c;
+ 	}
+ 
+ 	q[d.len++] = '\0';
+diff --git a/util.c b/util.c
+index 994436f..6d07292 100644
+--- a/util.c
++++ b/util.c
+@@ -25,6 +25,7 @@
+ #include <stdlib.h>
+ #include <stdarg.h>
+ #include <string.h>
++#include <assert.h>
+ 
+ #include "util.h"
+ 
+@@ -85,3 +86,101 @@ int util_is_printable_string(const void *data, int len)
+ 
+ 	return 1;
+ }
++
++/*
++ * Parse a octal encoded character starting at index i in string s.  The
++ * resulting character will be returned and the index i will be updated to
++ * point at the character directly after the end of the encoding, this may be
++ * the '\0' terminator of the string.
++ */
++static char get_oct_char(const char *s, int *i)
++{
++	char x[4];
++	char *endx;
++	long val;
++
++	x[3] = '\0';
++	strncpy(x, s + *i, 3);
++
++	val = strtol(x, &endx, 8);
++
++	assert(endx > x);
++
++	(*i) += endx - x;
++	return val;
++}
++
++/*
++ * Parse a hexadecimal encoded character starting at index i in string s.  The
++ * resulting character will be returned and the index i will be updated to
++ * point at the character directly after the end of the encoding, this may be
++ * the '\0' terminator of the string.
++ */
++static char get_hex_char(const char *s, int *i)
++{
++	char x[3];
++	char *endx;
++	long val;
++
++	x[2] = '\0';
++	strncpy(x, s + *i, 2);
++
++	val = strtol(x, &endx, 16);
++	if (!(endx  > x))
++		die("\\x used with no following hex digits\n");
++
++	(*i) += endx - x;
++	return val;
++}
++
++char get_escape_char(const char *s, int *i)
++{
++	char	c = s[*i];
++	int	j = *i + 1;
++	char	val;
++
++	assert(c);
++	switch (c) {
++	case 'a':
++		val = '\a';
++		break;
++	case 'b':
++		val = '\b';
++		break;
++	case 't':
++		val = '\t';
++		break;
++	case 'n':
++		val = '\n';
++		break;
++	case 'v':
++		val = '\v';
++		break;
++	case 'f':
++		val = '\f';
++		break;
++	case 'r':
++		val = '\r';
++		break;
++	case '0':
++	case '1':
++	case '2':
++	case '3':
++	case '4':
++	case '5':
++	case '6':
++	case '7':
++		j--; /* need to re-read the first digit as
++		      * part of the octal value */
++		val = get_oct_char(s, &j);
++		break;
++	case 'x':
++		val = get_hex_char(s, &j);
++		break;
++	default:
++		val = c;
++	}
++
++	(*i) = j;
++	return val;
++}
+diff --git a/util.h b/util.h
+index cc68933..f251480 100644
+--- a/util.h
++++ b/util.h
+@@ -64,4 +64,12 @@ extern char *join_path(const char *path, const char *name);
+  * @return 1 if a valid printable string, 0 if not */
+ int util_is_printable_string(const void *data, int len);
+ 
++/*
++ * Parse an escaped character starting at index i in string s.  The resulting
++ * character will be returned and the index i will be updated to point at the
++ * character directly after the end of the encoding, this may be the '\0'
++ * terminator of the string.
++ */
++char get_escape_char(const char *s, int *i);
++
+ #endif /* _UTIL_H */
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/07_Remove-gcc-4.6-set-but-not-used-warnings.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/07_Remove-gcc-4.6-set-but-not-used-warnings.patch
@@ -0,0 +1,101 @@
+From: David Gibson <david@gibson.dropbear.id.au>
+Date: Mon, 12 Sep 2011 01:18:43 +0000 (+1000)
+Subject: dtc: Remove gcc 4.6 "set but not used" warnings
+X-Git-Url: http://git.jdl.com/gitweb/?p=dtc.git;a=commitdiff_plain;h=83df28bd39979b32a75656cac291c36dbd4e5497
+
+dtc: Remove gcc 4.6 "set but not used" warnings
+
+A number of the dtc testcases trigger the new "variable set but not
+used" warning from gcc 4.6.  That is they have variables which are
+assigned, but then never read after that point.
+
+In a couple of cases this is just because the variables aren't needed,
+so this patch removes them.  In subnode_offset.c, it's because one
+pair of variables we clearly intended to test we don't actually test.
+This patch also adds this missing check.
+
+This patch makes the testsuite compile clean with gcc 4.6.
+
+Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
+---
+
+diff --git a/tests/notfound.c b/tests/notfound.c
+index 38918ad..4d55b88 100644
+--- a/tests/notfound.c
++++ b/tests/notfound.c
+@@ -37,27 +37,25 @@ static void check_error(const char *s, int err)
+ 
+ int main(int argc, char *argv[])
+ {
+-	const struct fdt_property *prop;
+ 	void *fdt;
+ 	int offset;
+ 	int subnode1_offset;
+-	const void *val;
+ 	int lenerr;
+ 
+ 	test_init(argc, argv);
+ 	fdt = load_blob_arg(argc, argv);
+ 
+-	prop = fdt_get_property(fdt, 0, "nonexistant-property", &lenerr);
++	fdt_get_property(fdt, 0, "nonexistant-property", &lenerr);
+ 	check_error("fdt_get_property(\"nonexistant-property\")", lenerr);
+ 
+-	val = fdt_getprop(fdt, 0, "nonexistant-property", &lenerr);
++	fdt_getprop(fdt, 0, "nonexistant-property", &lenerr);
+ 	check_error("fdt_getprop(\"nonexistant-property\"", lenerr);
+ 
+ 	subnode1_offset = fdt_subnode_offset(fdt, 0, "subnode@1");
+ 	if (subnode1_offset < 0)
+ 		FAIL("Couldn't find subnode1: %s", fdt_strerror(subnode1_offset));
+ 
+-	val = fdt_getprop(fdt, subnode1_offset, "prop-str", &lenerr);
++	fdt_getprop(fdt, subnode1_offset, "prop-str", &lenerr);
+ 	check_error("fdt_getprop(\"prop-str\")", lenerr);
+ 
+ 	offset = fdt_subnode_offset(fdt, 0, "nonexistant-subnode");
+diff --git a/tests/path_offset.c b/tests/path_offset.c
+index bb092f1..d3e1f8e 100644
+--- a/tests/path_offset.c
++++ b/tests/path_offset.c
+@@ -104,5 +104,9 @@ int main(int argc, char *argv[])
+ 		FAIL("Mismatch between subnode_offset (%d) and path_offset (%d)",
+ 		     subsubnode2_offset, subsubnode2_offset_p);
+ 
++	if (subsubnode2_offset2 != subsubnode2_offset2_p)
++		FAIL("Mismatch between subnode_offset (%d) and path_offset (%d)",
++		     subsubnode2_offset2, subsubnode2_offset2_p);
++
+ 	PASS();
+ }
+diff --git a/tests/subnode_offset.c b/tests/subnode_offset.c
+index b961070..e58c192 100644
+--- a/tests/subnode_offset.c
++++ b/tests/subnode_offset.c
+@@ -60,7 +60,7 @@ int main(int argc, char *argv[])
+ 	void *fdt;
+ 	int subnode1_offset, subnode2_offset;
+ 	int subsubnode1_offset, subsubnode2_offset, subsubnode2_offset2;
+-	int ss11_off, ss12_off, ss21_off, ss22_off;
++	int ss12_off, ss21_off;
+ 
+ 	test_init(argc, argv);
+ 	fdt = load_blob_arg(argc, argv);
+@@ -85,7 +85,7 @@ int main(int argc, char *argv[])
+ 	if (subsubnode2_offset != subsubnode2_offset2)
+ 		FAIL("Different offsets with and without unit address");
+ 
+-	ss11_off = check_subnode(fdt, subnode1_offset, "ss1");
++	check_subnode(fdt, subnode1_offset, "ss1");
+ 	ss21_off = fdt_subnode_offset(fdt, subnode2_offset, "ss1");
+ 	if (ss21_off != -FDT_ERR_NOTFOUND)
+ 		FAIL("Incorrectly found ss1 in subnode2");
+@@ -93,7 +93,7 @@ int main(int argc, char *argv[])
+ 	ss12_off = fdt_subnode_offset(fdt, subnode1_offset, "ss2");
+ 	if (ss12_off != -FDT_ERR_NOTFOUND)
+ 		FAIL("Incorrectly found ss2 in subnode1");
+-	ss22_off = check_subnode(fdt, subnode2_offset, "ss2");
++	check_subnode(fdt, subnode2_offset, "ss2");
+ 
+ 	PASS();
+ }
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/08_Support-character-literals-in-cell-lists.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/08_Support-character-literals-in-cell-lists.patch
@@ -0,0 +1,241 @@
+From: Anton Staaf <robotboy@chromium.org>
+Date: Fri, 9 Sep 2011 19:16:30 +0000 (-0700)
+Subject: dtc: Support character literals in cell lists
+X-Git-Url: http://git.jdl.com/gitweb/?p=dtc.git;a=commitdiff_plain;h=a4ea2fa9518ff0f4d7f4a08647599a727faac2e0
+
+dtc: Support character literals in cell lists
+
+With this patch the following property assignment:
+
+    property = <0x12345678 'a' '\r' 100>;
+
+is equivalent to:
+
+    property = <0x12345678 0x00000061 0x0000000D 0x00000064>
+
+Signed-off-by: Anton Staaf <robotboy@chromium.org>
+Acked-by: David Gibson <david@gibson.dropbear.id.au>
+---
+
+diff --git a/Documentation/dts-format.txt b/Documentation/dts-format.txt
+index a655b87..eae8b76 100644
+--- a/Documentation/dts-format.txt
++++ b/Documentation/dts-format.txt
+@@ -33,7 +33,7 @@ Property values may be defined as an array of 32-bit integer cells, as
+ NUL-terminated strings, as bytestrings or a combination of these.
+ 
+ * Arrays of cells are represented by angle brackets surrounding a
+-  space separated list of C-style integers
++  space separated list of C-style integers or character literals.
+ 
+ 	e.g. interrupts = <17 0xc>;
+ 
+diff --git a/dtc-lexer.l b/dtc-lexer.l
+index e866ea5..494e342 100644
+--- a/dtc-lexer.l
++++ b/dtc-lexer.l
+@@ -29,6 +29,7 @@ PROPNODECHAR	[a-zA-Z0-9,._+*#?@-]
+ PATHCHAR	({PROPNODECHAR}|[/])
+ LABEL		[a-zA-Z_][a-zA-Z0-9_]*
+ STRING		\"([^\\"]|\\.)*\"
++CHAR_LITERAL	'([^']|\\')*'
+ WS		[[:space:]]
+ COMMENT		"/*"([^*]|\*+[^*/])*\*+"/"
+ LINECOMMENT	"//".*\n
+@@ -109,6 +110,13 @@ static int pop_input_file(void);
+ 			return DT_LITERAL;
+ 		}
+ 
++<*>{CHAR_LITERAL}	{
++			yytext[yyleng-1] = '\0';
++			yylval.literal = xstrdup(yytext+1);
++			DPRINT("Character literal: %s\n", yylval.literal);
++			return DT_CHAR_LITERAL;
++		}
++
+ <*>\&{LABEL}	{	/* label reference */
+ 			DPRINT("Ref: %s\n", yytext+1);
+ 			yylval.labelref = xstrdup(yytext+1);
+diff --git a/dtc-parser.y b/dtc-parser.y
+index 5e84a67..554f11a 100644
+--- a/dtc-parser.y
++++ b/dtc-parser.y
+@@ -34,6 +34,7 @@ extern struct boot_info *the_boot_info;
+ extern int treesource_error;
+ 
+ static unsigned long long eval_literal(const char *s, int base, int bits);
++static unsigned char eval_char_literal(const char *s);
+ %}
+ 
+ %union {
+@@ -57,6 +58,7 @@ static unsigned long long eval_literal(const char *s, int base, int bits);
+ %token DT_MEMRESERVE
+ %token <propnodename> DT_PROPNODENAME
+ %token <literal> DT_LITERAL
++%token <literal> DT_CHAR_LITERAL
+ %token <cbase> DT_BASE
+ %token <byte> DT_BYTE
+ %token <data> DT_STRING
+@@ -265,6 +267,10 @@ cellval:
+ 		{
+ 			$$ = eval_literal($1, 0, 32);
+ 		}
++	| DT_CHAR_LITERAL
++		{
++			$$ = eval_char_literal($1);
++		}
+ 	;
+ 
+ bytestring:
+@@ -343,3 +349,29 @@ static unsigned long long eval_literal(const char *s, int base, int bits)
+ 		print_error("bad literal");
+ 	return val;
+ }
++
++static unsigned char eval_char_literal(const char *s)
++{
++	int i = 1;
++	char c = s[0];
++
++	if (c == '\0')
++	{
++		print_error("empty character literal");
++		return 0;
++	}
++
++	/*
++	 * If the first character in the character literal is a \ then process
++	 * the remaining characters as an escape encoding. If the first
++	 * character is neither an escape or a terminator it should be the only
++	 * character in the literal and will be returned.
++	 */
++	if (c == '\\')
++		c = get_escape_char(s, &i);
++
++	if (s[i] != '\0')
++		print_error("malformed character literal");
++
++	return c;
++}
+diff --git a/tests/.gitignore b/tests/.gitignore
+index f4e58b2..a3e9bd1 100644
+--- a/tests/.gitignore
++++ b/tests/.gitignore
+@@ -4,6 +4,7 @@
+ /add_subnode_with_nops
+ /asm_tree_dump
+ /boot-cpuid
++/char_literal
+ /del_node
+ /del_property
+ /dtbs_equal_ordered
+diff --git a/tests/Makefile.tests b/tests/Makefile.tests
+index c564e72..e718b63 100644
+--- a/tests/Makefile.tests
++++ b/tests/Makefile.tests
+@@ -5,6 +5,7 @@ LIB_TESTS_L = get_mem_rsv \
+ 	node_offset_by_prop_value node_offset_by_phandle \
+ 	node_check_compatible node_offset_by_compatible \
+ 	get_alias \
++	char_literal \
+ 	notfound \
+ 	setprop_inplace nop_property nop_node \
+ 	sw_tree1 \
+diff --git a/tests/char_literal.c b/tests/char_literal.c
+new file mode 100644
+index 0000000..150f2a0
+--- /dev/null
++++ b/tests/char_literal.c
+@@ -0,0 +1,50 @@
++/*
++ * libfdt - Flat Device Tree manipulation
++ *	Testcase for character literals in dtc
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ * Copyright (C) 2011 The Chromium Authors. All rights reserved.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public License
++ * as published by the Free Software Foundation; either version 2.1 of
++ * the License, or (at your option) any later version.
++ *
++ * This library 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++#include <stdlib.h>
++#include <stdio.h>
++#include <string.h>
++#include <stdint.h>
++
++#include <fdt.h>
++#include <libfdt.h>
++
++#include "tests.h"
++#include "testdata.h"
++
++int main(int argc, char *argv[])
++{
++	void *fdt;
++	uint32_t expected_cells[5];
++
++	expected_cells[0] = cpu_to_fdt32((unsigned char)TEST_CHAR1);
++	expected_cells[1] = cpu_to_fdt32((unsigned char)TEST_CHAR2);
++	expected_cells[2] = cpu_to_fdt32((unsigned char)TEST_CHAR3);
++	expected_cells[3] = cpu_to_fdt32((unsigned char)TEST_CHAR4);
++	expected_cells[4] = cpu_to_fdt32((unsigned char)TEST_CHAR5);
++
++	test_init(argc, argv);
++	fdt = load_blob_arg(argc, argv);
++
++	check_getprop(fdt, 0, "char-literal-cells",
++		      sizeof(expected_cells), expected_cells);
++
++	PASS();
++}
+diff --git a/tests/char_literal.dts b/tests/char_literal.dts
+new file mode 100644
+index 0000000..22e17ed
+--- /dev/null
++++ b/tests/char_literal.dts
+@@ -0,0 +1,5 @@
++/dts-v1/;
++
++/ {
++	char-literal-cells = <'\r' 'b' '\0' '\'' '\xff'>;
++};
+diff --git a/tests/run_tests.sh b/tests/run_tests.sh
+index 72dda32..1246df1 100755
+--- a/tests/run_tests.sh
++++ b/tests/run_tests.sh
+@@ -206,6 +206,9 @@ dtc_tests () {
+     run_dtc_test -I dts -O dtb -o dtc_escapes.test.dtb escapes.dts
+     run_test string_escapes dtc_escapes.test.dtb
+ 
++    run_dtc_test -I dts -O dtb -o dtc_char_literal.test.dtb char_literal.dts
++    run_test char_literal dtc_char_literal.test.dtb
++
+     run_dtc_test -I dts -O dtb -o dtc_extra-terminating-null.test.dtb extra-terminating-null.dts
+     run_test extra-terminating-null dtc_extra-terminating-null.test.dtb
+ 
+diff --git a/tests/testdata.h b/tests/testdata.h
+index 5b5a9a3..d4c6759 100644
+--- a/tests/testdata.h
++++ b/tests/testdata.h
+@@ -19,6 +19,12 @@
+ #define TEST_STRING_2	"nastystring: \a\b\t\n\v\f\r\\\""
+ #define TEST_STRING_3	"\xde\xad\xbe\xef"
+ 
++#define TEST_CHAR1	'\r'
++#define TEST_CHAR2	'b'
++#define TEST_CHAR3	'\0'
++#define TEST_CHAR4	'\''
++#define TEST_CHAR5	'\xff'
++
+ #ifndef __ASSEMBLY__
+ extern struct fdt_header _test_tree1;
+ extern struct fdt_header _truncated_property;
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/09_Create-Makefile_utils-and-move-ftdump-into-it.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/09_Create-Makefile_utils-and-move-ftdump-into-it.patch
@@ -0,0 +1,62 @@
+From: Simon Glass <sjg@chromium.org>
+Date: Wed, 21 Sep 2011 20:32:44 +0000 (-0700)
+Subject: Create Makefile.utils and move ftdump into it
+X-Git-Url: http://git.jdl.com/gitweb/?p=dtc.git;a=commitdiff_plain;h=9ebd9b4a56e54656431111e5ea7cd74e651910bf
+
+Create Makefile.utils and move ftdump into it
+
+We want to avoid a separate Makefile include for each utility, so this sets
+up a general one for utilities.
+
+Acked-by: David Gibson <david@gibson.dropbear.id.au>
+Signed-off-by: Simon Glass <sjg@chromium.org>
+---
+
+diff --git a/Makefile b/Makefile
+index 2172d9a..380a705 100644
+--- a/Makefile
++++ b/Makefile
+@@ -105,7 +105,7 @@ endef
+ 
+ include Makefile.convert-dtsv0
+ include Makefile.dtc
+-include Makefile.ftdump
++include Makefile.utils
+ 
+ BIN += convert-dtsv0
+ BIN += dtc
+diff --git a/Makefile.ftdump b/Makefile.ftdump
+deleted file mode 100644
+index 2744a18..0000000
+--- a/Makefile.ftdump
++++ /dev/null
+@@ -1,13 +0,0 @@
+-#
+-# This is not a complete Makefile of itself.
+-# Instead, it is designed to be easily embeddable
+-# into other systems of Makefiles.
+-#
+-
+-FTDUMP_SRCS = \
+-	ftdump.c \
+-	util.c
+-
+-FTDUMP_GEN_SRCS =
+-
+-FTDUMP_OBJS = $(FTDUMP_SRCS:%.c=%.o) $(FTDUMP_GEN_SRCS:%.c=%.o)
+diff --git a/Makefile.utils b/Makefile.utils
+new file mode 100644
+index 0000000..0ed9297
+--- /dev/null
++++ b/Makefile.utils
+@@ -0,0 +1,10 @@
++#
++# This is not a complete Makefile of itself.  Instead, it is designed to
++# be easily embeddable into other systems of Makefiles.
++#
++
++FTDUMP_SRCS = \
++	ftdump.c \
++	util.c
++
++FTDUMP_OBJS = $(FTDUMP_SRCS:%.c=%.o)
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/10_Add-fdt-read_write-utility-functions.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/10_Add-fdt-read_write-utility-functions.patch
@@ -0,0 +1,502 @@
+From: Simon Glass <sjg@chromium.org>
+Date: Thu, 22 Sep 2011 17:11:02 +0000 (-0700)
+Subject: Add fdt read/write utility functions
+X-Git-Url: http://git.jdl.com/gitweb/?p=dtc.git;a=commitdiff_plain;h=36204fdf742cabc074617648a5b2cf62409dc40b
+
+Add fdt read/write utility functions
+
+This adds higher-level libfdt operations for reading/writing an fdt
+blob from/to a file, as well as a function to decode a data type string
+as will be used by fdtget, fdtput.
+
+This also adds a few tests for the simple type argument supported by
+utilfdt_decode_type.
+
+Signed-off-by: Simon Glass <sjg@chromium.org>
+Acked-by: David Gibson <david@gibson.dropbear.id.au>
+---
+
+diff --git a/Makefile b/Makefile
+index 380a705..b32409b 100644
+--- a/Makefile
++++ b/Makefile
+@@ -15,7 +15,7 @@ EXTRAVERSION =
+ LOCAL_VERSION =
+ CONFIG_LOCALVERSION =
+ 
+-CPPFLAGS = -I libfdt
++CPPFLAGS = -I libfdt -I .
+ WARNINGS = -Werror -Wall -Wpointer-arith -Wcast-qual -Wnested-externs \
+ 	-Wstrict-prototypes -Wmissing-prototypes -Wredundant-decls
+ CFLAGS = -g -Os -fPIC -Werror $(WARNINGS)
+diff --git a/tests/Makefile.tests b/tests/Makefile.tests
+index e718b63..41695df 100644
+--- a/tests/Makefile.tests
++++ b/tests/Makefile.tests
+@@ -16,7 +16,8 @@ LIB_TESTS_L = get_mem_rsv \
+ 	extra-terminating-null \
+ 	dtbs_equal_ordered \
+ 	dtb_reverse dtbs_equal_unordered \
+-	add_subnode_with_nops path_offset_aliases
++	add_subnode_with_nops path_offset_aliases \
++	utilfdt_test
+ LIB_TESTS = $(LIB_TESTS_L:%=$(TESTS_PREFIX)%)
+ 
+ LIBTREE_TESTS_L = truncated_property
+@@ -42,7 +43,7 @@ TESTS_CLEANFILES = $(TESTS) $(TESTS_CLEANFILES_L:%=$(TESTS_PREFIX)%)
+ .PHONY: tests
+ tests:	$(TESTS) $(TESTS_TREES)
+ 
+-$(LIB_TESTS): %: $(TESTS_PREFIX)testutils.o $(LIBFDT_archive)
++$(LIB_TESTS): %: $(TESTS_PREFIX)testutils.o util.o $(LIBFDT_archive)
+ 
+ $(DL_LIB_TESTS): %: %.o $(TESTS_PREFIX)testutils.o $(LIBFDT_archive)
+ 	@$(VECHO) LD [libdl] $@
+diff --git a/tests/run_tests.sh b/tests/run_tests.sh
+index 1246df1..e2c3046 100755
+--- a/tests/run_tests.sh
++++ b/tests/run_tests.sh
+@@ -391,6 +391,10 @@ dtbs_equal_tests () {
+     cmp_tests test_tree1.dtb $WRONG_TREE1
+ }
+ 
++utilfdt_tests () {
++    run_test utilfdt_test
++}
++
+ while getopts "vt:m" ARG ; do
+     case $ARG in
+ 	"v")
+@@ -406,7 +410,7 @@ while getopts "vt:m" ARG ; do
+ done
+ 
+ if [ -z "$TESTSETS" ]; then
+-    TESTSETS="libfdt dtc dtbs_equal"
++    TESTSETS="libfdt utilfdt dtc dtbs_equal"
+ fi
+ 
+ # Make sure we don't have stale blobs lying around
+@@ -417,6 +421,9 @@ for set in $TESTSETS; do
+ 	"libfdt")
+ 	    libfdt_tests
+ 	    ;;
++	"utilfdt")
++	    utilfdt_tests
++	    ;;
+ 	"dtc")
+ 	    dtc_tests
+ 	    ;;
+diff --git a/tests/tests.h b/tests/tests.h
+index fcb2b2a..a51556d 100644
+--- a/tests/tests.h
++++ b/tests/tests.h
+@@ -93,22 +93,6 @@ void cleanup(void);
+ 		exit(RC_BUG);				\
+ 	} while (0)
+ 
+-static inline void *xmalloc(size_t size)
+-{
+-	void *p = malloc(size);
+-	if (! p)
+-		FAIL("malloc() failure");
+-	return p;
+-}
+-
+-static inline void *xrealloc(void *p, size_t size)
+-{
+-	p = realloc(p, size);
+-	if (! p)
+-		FAIL("realloc() failure");
+-	return p;
+-}
+-
+ void check_mem_rsv(void *fdt, int n, uint64_t addr, uint64_t size);
+ 
+ void check_property(void *fdt, int nodeoffset, const char *name,
+@@ -135,4 +119,6 @@ void *load_blob_arg(int argc, char *argv[]);
+ void save_blob(const char *filename, void *blob);
+ void *open_blob_rw(void *blob);
+ 
++#include "util.h"
++
+ #endif /* _TESTS_H */
+diff --git a/tests/utilfdt_test.c b/tests/utilfdt_test.c
+new file mode 100644
+index 0000000..36b4aa5
+--- /dev/null
++++ b/tests/utilfdt_test.c
+@@ -0,0 +1,128 @@
++/*
++ * Copyright 2011 The Chromium Authors, All Rights Reserved.
++ *
++ * utilfdt_test - Tests for utilfdt library
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public License
++ * as published by the Free Software Foundation; either version 2.1 of
++ * the License, or (at your option) any later version.
++ *
++ * This library 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++#include <assert.h>
++#include <stdlib.h>
++#include <stdio.h>
++#include <string.h>
++#include <stdint.h>
++#include <stdarg.h>
++
++#include <fdt.h>
++#include <libfdt.h>
++#include <util.h>
++
++#include "tests.h"
++#include "testdata.h"
++
++static void check(const char *fmt, int expect_type, int expect_size)
++{
++	int type;
++	int size;
++
++	if (utilfdt_decode_type(fmt, &type, &size))
++		FAIL("format '%s': valid format string returned failure", fmt);
++	if (expect_type != type)
++		FAIL("format '%s': expected type='%c', got type='%c'", fmt,
++		     expect_type, type);
++	if (expect_size != size)
++		FAIL("format '%s': expected size=%d, got size=%d", fmt,
++		     expect_size, size);
++}
++
++static void checkfail(const char *fmt)
++{
++	int type;
++	int size;
++
++	if (!utilfdt_decode_type(fmt, &type, &size))
++		FAIL("format '%s': invalid format string returned success",
++		     fmt);
++}
++
++/**
++ * Add the given modifier to each of the valid sizes, and check that we get
++ * correct values.
++ *
++ * \param modifier	Modifer string to use as a prefix
++ * \param expected_size	The size (in bytes) that we expect (ignored for
++ *			strings)
++ */
++static void check_sizes(char *modifier, int expected_size)
++{
++	char fmt[10], *ptr;
++
++	/* set up a string with a hole in it for the format character */
++	if (strlen(modifier) + 2 >= sizeof(fmt))
++		FAIL("modifier string '%s' too long", modifier);
++	strcpy(fmt, modifier);
++	ptr = fmt + strlen(fmt);
++	ptr[1] = '\0';
++
++	/* now try each format character in turn */
++	*ptr = 'i';
++	check(fmt, 'i', expected_size);
++
++	*ptr = 'u';
++	check(fmt, 'u', expected_size);
++
++	*ptr = 'x';
++	check(fmt, 'x', expected_size);
++
++	*ptr = 's';
++	check(fmt, 's', -1);
++}
++
++static void test_utilfdt_decode_type(void)
++{
++	char fmt[10];
++	int ch;
++
++	/* check all the valid modifiers and sizes */
++	check_sizes("", -1);
++	check_sizes("b", 1);
++	check_sizes("hh", 1);
++	check_sizes("h", 2);
++	check_sizes("l", 4);
++
++	/* try every other character */
++	checkfail("");
++	for (ch = ' '; ch < 127; ch++) {
++		if (!strchr("iuxs", ch)) {
++			*fmt = ch;
++			fmt[1] = '\0';
++			checkfail(fmt);
++		}
++	}
++
++	/* try a few modifiers at the end */
++	checkfail("sx");
++	checkfail("ihh");
++	checkfail("xb");
++
++	/* and one for the doomsday archives */
++	checkfail("He has all the virtues I dislike and none of the vices "
++			"I admire.");
++}
++
++int main(int argc, char *argv[])
++{
++	test_utilfdt_decode_type();
++	PASS();
++}
+diff --git a/util.c b/util.c
+index 6d07292..d82d41f 100644
+--- a/util.c
++++ b/util.c
+@@ -1,4 +1,5 @@
+ /*
++ * Copyright 2011 The Chromium Authors, All Rights Reserved.
+  * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc.
+  *
+  * util_is_printable_string contributed by
+@@ -27,6 +28,11 @@
+ #include <string.h>
+ #include <assert.h>
+ 
++#include <errno.h>
++#include <fcntl.h>
++#include <unistd.h>
++
++#include "libfdt.h"
+ #include "util.h"
+ 
+ char *xstrdup(const char *s)
+@@ -184,3 +190,139 @@ char get_escape_char(const char *s, int *i)
+ 	(*i) = j;
+ 	return val;
+ }
++
++int utilfdt_read_err(const char *filename, char **buffp)
++{
++	int fd = 0;	/* assume stdin */
++	char *buf = NULL;
++	off_t bufsize = 1024, offset = 0;
++	int ret = 0;
++
++	*buffp = NULL;
++	if (strcmp(filename, "-") != 0) {
++		fd = open(filename, O_RDONLY);
++		if (fd < 0)
++			return errno;
++	}
++
++	/* Loop until we have read everything */
++	buf = malloc(bufsize);
++	do {
++		/* Expand the buffer to hold the next chunk */
++		if (offset == bufsize) {
++			bufsize *= 2;
++			buf = realloc(buf, bufsize);
++			if (!buf) {
++				ret = ENOMEM;
++				break;
++			}
++		}
++
++		ret = read(fd, &buf[offset], bufsize - offset);
++		if (ret < 0) {
++			ret = errno;
++			break;
++		}
++		offset += ret;
++	} while (ret != 0);
++
++	/* Clean up, including closing stdin; return errno on error */
++	close(fd);
++	if (ret)
++		free(buf);
++	else
++		*buffp = buf;
++	return ret;
++}
++
++char *utilfdt_read(const char *filename)
++{
++	char *buff;
++	int ret = utilfdt_read_err(filename, &buff);
++
++	if (ret) {
++		fprintf(stderr, "Couldn't open blob from '%s': %s\n", filename,
++			strerror(ret));
++		return NULL;
++	}
++	/* Successful read */
++	return buff;
++}
++
++int utilfdt_write_err(const char *filename, const void *blob)
++{
++	int fd = 1;	/* assume stdout */
++	int totalsize;
++	int offset;
++	int ret = 0;
++	const char *ptr = blob;
++
++	if (strcmp(filename, "-") != 0) {
++		fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
++		if (fd < 0)
++			return errno;
++	}
++
++	totalsize = fdt_totalsize(blob);
++	offset = 0;
++
++	while (offset < totalsize) {
++		ret = write(fd, ptr + offset, totalsize - offset);
++		if (ret < 0) {
++			ret = -errno;
++			break;
++		}
++		offset += ret;
++	}
++	/* Close the file/stdin; return errno on error */
++	if (fd != 1)
++		close(fd);
++	return ret < 0 ? -ret : 0;
++}
++
++
++int utilfdt_write(const char *filename, const void *blob)
++{
++	int ret = utilfdt_write_err(filename, blob);
++
++	if (ret) {
++		fprintf(stderr, "Couldn't write blob to '%s': %s\n", filename,
++			strerror(ret));
++	}
++	return ret ? -1 : 0;
++}
++
++int utilfdt_decode_type(const char *fmt, int *type, int *size)
++{
++	int qualifier = 0;
++
++	/* get the conversion qualifier */
++	*size = -1;
++	if (strchr("hlLb", *fmt)) {
++		qualifier = *fmt++;
++		if (qualifier == *fmt) {
++			switch (*fmt++) {
++/* TODO:		case 'l': qualifier = 'L'; break;*/
++			case 'h':
++				qualifier = 'b';
++				break;
++			}
++		}
++	}
++
++	/* we should now have a type */
++	if (!strchr("iuxs", *fmt))
++		return -1;
++
++	/* convert qualifier (bhL) to byte size */
++	if (*fmt != 's')
++		*size = qualifier == 'b' ? 1 :
++				qualifier == 'h' ? 2 :
++				qualifier == 'l' ? 4 : -1;
++	*type = *fmt++;
++
++	/* that should be it! */
++	if (*fmt)
++		return -1;
++	return 0;
++}
+diff --git a/util.h b/util.h
+index f251480..730918e 100644
+--- a/util.h
++++ b/util.h
+@@ -4,6 +4,7 @@
+ #include <stdarg.h>
+ 
+ /*
++ * Copyright 2011 The Chromium Authors, All Rights Reserved.
+  * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc.
+  *
+  * This program is free software; you can redistribute it and/or
+@@ -72,4 +73,71 @@ int util_is_printable_string(const void *data, int len);
+  */
+ char get_escape_char(const char *s, int *i);
+ 
++/**
++ * Read a device tree file into a buffer. This will report any errors on
++ * stderr.
++ *
++ * @param filename	The filename to read, or - for stdin
++ * @return Pointer to allocated buffer containing fdt, or NULL on error
++ */
++char *utilfdt_read(const char *filename);
++
++/**
++ * Read a device tree file into a buffer. Does not report errors, but only
++ * returns them. The value returned can be passed to strerror() to obtain
++ * an error message for the user.
++ *
++ * @param filename	The filename to read, or - for stdin
++ * @param buffp		Returns pointer to buffer containing fdt
++ * @return 0 if ok, else an errno value representing the error
++ */
++int utilfdt_read_err(const char *filename, char **buffp);
++
++
++/**
++ * Write a device tree buffer to a file. This will report any errors on
++ * stderr.
++ *
++ * @param filename	The filename to write, or - for stdout
++ * @param blob		Poiner to buffer containing fdt
++ * @return 0 if ok, -1 on error
++ */
++int utilfdt_write(const char *filename, const void *blob);
++
++/**
++ * Write a device tree buffer to a file. Does not report errors, but only
++ * returns them. The value returned can be passed to strerror() to obtain
++ * an error message for the user.
++ *
++ * @param filename	The filename to write, or - for stdout
++ * @param blob		Poiner to buffer containing fdt
++ * @return 0 if ok, else an errno value representing the error
++ */
++int utilfdt_write_err(const char *filename, const void *blob);
++
++/**
++ * Decode a data type string. The purpose of this string
++ *
++ * The string consists of an optional character followed by the type:
++ *	Modifier characters:
++ *		hh or b	1 byte
++ *		h	2 byte
++ *		l	4 byte, default
++ *
++ *	Type character:
++ *		s	string
++ *		i	signed integer
++ *		u	unsigned integer
++ *		x	hex
++ *
++ * TODO: Implement ll modifier (8 bytes)
++ * TODO: Implement o type (octal)
++ *
++ * @param fmt		Format string to process
++ * @param type		Returns type found(s/d/u/x), or 0 if none
++ * @param size		Returns size found(1,2,4,8) or 4 if none
++ * @return 0 if ok, -1 on error (no type given, or other invalid format)
++ */
++int utilfdt_decode_type(const char *fmt, int *type, int *size);
++
+ #endif /* _UTIL_H */
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/11_Make-testutils-use-utilfdt.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/11_Make-testutils-use-utilfdt.patch
@@ -0,0 +1,111 @@
+From: Simon Glass <sjg@chromium.org>
+Date: Thu, 22 Sep 2011 17:11:03 +0000 (-0700)
+Subject: Make testutils use utilfdt
+X-Git-Url: http://git.jdl.com/gitweb/?p=dtc.git;a=commitdiff_plain;h=1c25c0d520dee58bfd86626a07036fe9febfebe6
+
+Make testutils use utilfdt
+
+The load_blob() and save_blob() functions are very similar to the utilfdt
+versions. This removes the duplicated code.
+
+Signed-off-by: Simon Glass <sjg@chromium.org>
+Acked-by: David Gibson <david@gibson.dropbear.id.au>
+---
+
+diff --git a/tests/Makefile.tests b/tests/Makefile.tests
+index 41695df..cae8390 100644
+--- a/tests/Makefile.tests
++++ b/tests/Makefile.tests
+@@ -45,11 +45,12 @@ tests:	$(TESTS) $(TESTS_TREES)
+ 
+ $(LIB_TESTS): %: $(TESTS_PREFIX)testutils.o util.o $(LIBFDT_archive)
+ 
+-$(DL_LIB_TESTS): %: %.o $(TESTS_PREFIX)testutils.o $(LIBFDT_archive)
++$(DL_LIB_TESTS): %: %.o $(TESTS_PREFIX)testutils.o util.o $(LIBFDT_archive)
+ 	@$(VECHO) LD [libdl] $@
+ 	$(LINK.c) -o $@ $^ -ldl
+ 
+-$(LIBTREE_TESTS): %: $(TESTS_PREFIX)testutils.o $(TESTS_PREFIX)trees.o $(LIBFDT_archive)
++$(LIBTREE_TESTS): %: $(TESTS_PREFIX)testutils.o $(TESTS_PREFIX)trees.o \
++		util.o $(LIBFDT_archive)
+ 
+ $(TESTS_PREFIX)dumptrees: $(TESTS_PREFIX)trees.o
+ 
+diff --git a/tests/testutils.c b/tests/testutils.c
+index b0a2230..f185133 100644
+--- a/tests/testutils.c
++++ b/tests/testutils.c
+@@ -159,33 +159,13 @@ int nodename_eq(const char *s1, const char *s2)
+ 
+ void *load_blob(const char *filename)
+ {
+-	int fd;
+-	int offset = 0;
+-	int bufsize = 1024;
+-	char *p = NULL;
+-	int ret;
+-
+-	fd = open(filename, O_RDONLY);
+-	if (fd < 0)
+-		CONFIG("Couldn't open blob from \"%s\": %s", filename,
+-		       strerror(errno));
+-
+-	p = xmalloc(bufsize);
+-	do {
+-		if (offset == bufsize) {
+-			bufsize *= 2;
+-			p = xrealloc(p, bufsize);
+-		}
+-
+-		ret = read(fd, &p[offset], bufsize - offset);
+-		if (ret < 0)
+-			CONFIG("Couldn't read from \"%s\": %s", filename,
+-			       strerror(errno));
+-
+-		offset += ret;
+-	} while (ret != 0);
++	char *blob;
++	int ret = utilfdt_read_err(filename, &blob);
+ 
+-	return p;
++	if (ret)
++		CONFIG("Couldn't open blob from \"%s\": %s", filename,
++		       strerror(ret));
++	return blob;
+ }
+ 
+ void *load_blob_arg(int argc, char *argv[])
+@@ -197,28 +177,11 @@ void *load_blob_arg(int argc, char *argv[])
+ 
+ void save_blob(const char *filename, void *fdt)
+ {
+-	int fd;
+-	int totalsize;
+-	int offset;
+-	char *p;
+-	int ret;
+-
+-	fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+-	if (fd < 0)
+-		CONFIG("Couldn't open \"%s\" to write blob: %s", filename,
+-		       strerror(errno));
+-
+-	totalsize = fdt_totalsize(fdt);
+-	offset = 0;
+-	p = fdt;
+-
+-	while (offset < totalsize) {
+-		ret = write(fd, p + offset, totalsize - offset);
+-		if (ret < 0)
+-			CONFIG("Couldn't write to \"%s\": %s", filename,
+-			       strerror(errno));
+-		offset += ret;
+-	}
++	int ret = utilfdt_write_err(filename, fdt);
++
++	if (ret)
++		CONFIG("Couldn't write blob to \"%s\": %s", filename,
++		       strerror(ret));
+ }
+ 
+ void *open_blob_rw(void *blob)
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/12_use-utilfdt-to-read-blob.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/12_use-utilfdt-to-read-blob.patch
@@ -0,0 +1,71 @@
+From: Simon Glass <sjg@chromium.org>
+Date: Thu, 22 Sep 2011 17:11:04 +0000 (-0700)
+Subject: ftdump: use utilfdt to read blob
+X-Git-Url: http://git.jdl.com/gitweb/?p=dtc.git;a=commitdiff_plain;h=07a8691fbbeb2a7e0cff85fb24435e2dc71facaf
+
+ftdump: use utilfdt to read blob
+
+Now that we have utilfdt_read(), ftdump should use it too.
+
+Signed-off-by: Simon Glass <sjg@chromium.org>
+Acked-by: David Gibson <david@gibson.dropbear.id.au>
+---
+
+diff --git a/ftdump.c b/ftdump.c
+index db932e3..cc55fe2 100644
+--- a/ftdump.c
++++ b/ftdump.c
+@@ -13,8 +13,6 @@
+ 
+ #include "util.h"
+ 
+-#define FTDUMP_BUF_SIZE	65536
+-
+ #define ALIGN(x, a)	(((x) + ((a) - 1)) & ~((a) - 1))
+ #define PALIGN(p, a)	((void *)(ALIGN((unsigned long)(p), (a))))
+ #define GET_CELL(p)	(p += 4, *((const uint32_t *)(p-4)))
+@@ -147,40 +145,18 @@ static void dump_blob(void *blob)
+ 
+ int main(int argc, char *argv[])
+ {
+-	FILE *fp;
+ 	char *buf;
+-	int size;
+ 
+ 	if (argc < 2) {
+ 		fprintf(stderr, "supply input filename\n");
+ 		return 5;
+ 	}
+ 
+-	if (strcmp(argv[1], "-") == 0) {
+-		fp = stdin;
+-	} else {
+-		fp = fopen(argv[1], "rb");
+-		if (fp == NULL) {
+-			fprintf(stderr, "unable to open %s\n", argv[1]);
+-			return 10;
+-		}
+-	}
+-
+-	buf = malloc(FTDUMP_BUF_SIZE);
+-	if (!buf) {
+-		fprintf(stderr, "Couldn't allocate %d byte buffer\n", FTDUMP_BUF_SIZE);
++	buf = utilfdt_read(argv[1]);
++	if (buf)
++		dump_blob(buf);
++	else
+ 		return 10;
+-	}
+-
+-	size = fread(buf, 1, FTDUMP_BUF_SIZE, fp);
+-	if (size == FTDUMP_BUF_SIZE) {
+-		fprintf(stderr, "file too large (maximum is %d bytes)\n", FTDUMP_BUF_SIZE);
+-		return 10;
+-	}
+-
+-	dump_blob(buf);
+-
+-	fclose(fp);
+ 
+ 	return 0;
+ }
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/13_Add-fdt16_to_cpu-utility-function.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/13_Add-fdt16_to_cpu-utility-function.patch
@@ -0,0 +1,32 @@
+From: Anton Staaf <robotboy@chromium.org>
+Date: Tue, 11 Oct 2011 17:22:27 +0000 (-0700)
+Subject: libfdt: Add fdt16_to_cpu utility function
+X-Git-Url: http://git.jdl.com/gitweb/?p=dtc.git;a=commitdiff_plain;h=2cd4c8d27d6b5ea83723754da4eba5d51aa71b95
+
+libfdt: Add fdt16_to_cpu utility function
+
+This utility routine will be used in the variable size cell literal
+append code.  It is a straightforward adaptation of the fdt32_to_cpu
+function.
+
+Signed-off-by: Anton Staaf <robotboy@chromium.org>
+Acked-by: David Gibson <david@gibson.dropbear.id.au>
+---
+
+diff --git a/libfdt/libfdt_env.h b/libfdt/libfdt_env.h
+index 449bf60..da952e7 100644
+--- a/libfdt/libfdt_env.h
++++ b/libfdt/libfdt_env.h
+@@ -6,6 +6,12 @@
+ #include <string.h>
+ 
+ #define _B(n)	((unsigned long long)((uint8_t *)&x)[n])
++static inline uint16_t fdt16_to_cpu(uint16_t x)
++{
++	return (_B(0) << 8) | _B(1);
++}
++#define cpu_to_fdt16(x) fdt16_to_cpu(x)
++
+ static inline uint32_t fdt32_to_cpu(uint32_t x)
+ {
+ 	return (_B(0) << 24) | (_B(1) << 16) | (_B(2) << 8) | _B(3);
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/14_Add-data_append_integer-function.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/14_Add-data_append_integer-function.patch
@@ -0,0 +1,91 @@
+From: Anton Staaf <robotboy@chromium.org>
+Date: Tue, 11 Oct 2011 17:22:28 +0000 (-0700)
+Subject: dtc: Add data_append_integer function
+X-Git-Url: http://git.jdl.com/gitweb/?p=dtc.git;a=commitdiff_plain;h=a4b515c03804dbc0eff5bbf281bd22438717e773
+
+dtc: Add data_append_integer function
+
+This function deals with appending integers of various sizes (8, 16
+32, and 64 bit currently).  It handles endianess conversions.  If the
+integer will not fit in the requested number of bits of storage it
+will have it's high bits ignored.
+
+This patch also rewrites data_append_cell and data_append_addr to use
+data_append_integer.
+
+Signed-off-by: Anton Staaf <robotboy@chromium.org>
+Acked-by: David Gibson <david@gibson.dropbear.id.au>
+---
+
+diff --git a/data.c b/data.c
+index b5f3066..4a40c5b 100644
+--- a/data.c
++++ b/data.c
+@@ -168,11 +168,33 @@ struct data data_merge(struct data d1, struct data d2)
+ 	return d;
+ }
+ 
+-struct data data_append_cell(struct data d, cell_t word)
++struct data data_append_integer(struct data d, uint64_t value, int bits)
+ {
+-	cell_t beword = cpu_to_fdt32(word);
+-
+-	return data_append_data(d, &beword, sizeof(beword));
++	uint8_t value_8;
++	uint16_t value_16;
++	uint32_t value_32;
++	uint64_t value_64;
++
++	switch (bits) {
++	case 8:
++		value_8 = value;
++		return data_append_data(d, &value_8, 1);
++
++	case 16:
++		value_16 = cpu_to_fdt16(value);
++		return data_append_data(d, &value_16, 2);
++
++	case 32:
++		value_32 = cpu_to_fdt32(value);
++		return data_append_data(d, &value_32, 4);
++
++	case 64:
++		value_64 = cpu_to_fdt64(value);
++		return data_append_data(d, &value_64, 8);
++
++	default:
++		die("Invalid literal size (%d)\n", bits);
++	}
+ }
+ 
+ struct data data_append_re(struct data d, const struct fdt_reserve_entry *re)
+@@ -185,11 +207,14 @@ struct data data_append_re(struct data d, const struct fdt_reserve_entry *re)
+ 	return data_append_data(d, &bere, sizeof(bere));
+ }
+ 
+-struct data data_append_addr(struct data d, uint64_t addr)
++struct data data_append_cell(struct data d, cell_t word)
+ {
+-	uint64_t beaddr = cpu_to_fdt64(addr);
++	return data_append_integer(d, word, sizeof(word) * 8);
++}
+ 
+-	return data_append_data(d, &beaddr, sizeof(beaddr));
++struct data data_append_addr(struct data d, uint64_t addr)
++{
++	return data_append_integer(d, addr, sizeof(addr) * 8);
+ }
+ 
+ struct data data_append_byte(struct data d, uint8_t byte)
+diff --git a/dtc.h b/dtc.h
+index f37c97e..7b4c65b 100644
+--- a/dtc.h
++++ b/dtc.h
+@@ -109,6 +109,7 @@ struct data data_insert_at_marker(struct data d, struct marker *m,
+ 				  const void *p, int len);
+ struct data data_merge(struct data d1, struct data d2);
+ struct data data_append_cell(struct data d, cell_t word);
++struct data data_append_integer(struct data d, uint64_t word, int bits);
+ struct data data_append_re(struct data d, const struct fdt_reserve_entry *re);
+ struct data data_append_addr(struct data d, uint64_t addr);
+ struct data data_append_byte(struct data d, uint8_t byte);
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/15_Add-support-for-variable-sized-elements.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/15_Add-support-for-variable-sized-elements.patch
@@ -0,0 +1,400 @@
+From: Anton Staaf <robotboy@chromium.org>
+Date: Tue, 11 Oct 2011 17:22:29 +0000 (-0700)
+Subject: dtc: Add support for variable sized elements
+X-Git-Url: http://git.jdl.com/gitweb/?p=dtc.git;a=commitdiff_plain;h=033089f29099bdfd5c2d6986cdb9fd07b16cfde0
+
+dtc: Add support for variable sized elements
+
+Elements of size 8, 16, 32, and 64 bits are supported.  The new
+/bits/ syntax was selected so as to not pollute the reserved
+keyword space with uint8/uint16/... type names.
+
+With this patch the following property assignment:
+
+    property = /bits/ 16 <0x1234 0x5678 0x0 0xffff>;
+
+is equivalent to:
+
+    property = <0x12345678 0x0000ffff>;
+
+It is now also possible to directly specify a 64 bit literal in a
+cell list, also known as an array using:
+
+    property = /bits/ 64 <0xdeadbeef00000000>;
+
+It is an error to attempt to store a literal into an element that is
+too small to hold the literal, and the compiler will generate an
+error when it detects this.  For instance:
+
+    property = /bits/ 8 <256>;
+
+Will fail to compile.  It is also an error to attempt to place a
+reference in a non 32-bit element.
+
+The documentation has been changed to reflect that the cell list
+is now an array of elements that can be of sizes other than the
+default 32-bit cell size.
+
+The sized_cells test tests the creation and access of 8, 16, 32,
+and 64-bit sized elements.  It also tests that the creation of two
+properties, one with 16 bit elements and one with 32 bit elements
+result in the same property contents.
+
+Signed-off-by: Anton Staaf <robotboy@chromium.org>
+Acked-by: David Gibson <david@gibson.dropbear.id.au>
+---
+
+diff --git a/Documentation/dts-format.txt b/Documentation/dts-format.txt
+index eae8b76..41741df 100644
+--- a/Documentation/dts-format.txt
++++ b/Documentation/dts-format.txt
+@@ -29,18 +29,28 @@ except for properties with empty (zero length) value which have the
+ form:
+ 	[label:] property-name;
+ 
+-Property values may be defined as an array of 32-bit integer cells, as
+-NUL-terminated strings, as bytestrings or a combination of these.
++Property values may be defined as an array of 8, 16, 32, or 64-bit integer
++elements, as NUL-terminated strings, as bytestrings or a combination of these.
+ 
+-* Arrays of cells are represented by angle brackets surrounding a
+-  space separated list of C-style integers or character literals.
++* Arrays are represented by angle brackets surrounding a space separated list
++  of C-style integers or character literals.  Array elements default to 32-bits
++  in size.  An array of 32-bit elements is also known as a cell list or a list
++  of cells.  A cell being an unsigned 32-bit integer.
+ 
+ 	e.g. interrupts = <17 0xc>;
+ 
+-* A 64-bit value is represented with two 32-bit cells.
++* A 64-bit value can be represented with two 32-bit elements.
+ 
+ 	e.g. clock-frequency = <0x00000001 0x00000000>;
+ 
++* The storage size of an element can be changed using the /bits/ prefix.  The
++  /bits/ prefix allows for the creation of 8, 16, 32, and 64-bit elements.
++  The resulting array will not be padded to a multiple of the default 32-bit
++  element size.
++
++	e.g. interrupts = /bits/ 8 <17 0xc>;
++	e.g. clock-frequency = /bits/ 64 <0x0000000100000000>;
++
+ * A NUL-terminated string value is represented using double quotes
+   (the property value is considered to include the terminating NUL
+   character).
+@@ -59,19 +69,20 @@ NUL-terminated strings, as bytestrings or a combination of these.
+ 	e.g. compatible = "ns16550", "ns8250";
+ 	     example = <0xf00f0000 19>, "a strange property format";
+ 
+-* In a cell array a reference to another node will be expanded to that
+-  node's phandle.  References may by '&' followed by a node's label:
++* In an array a reference to another node will be expanded to that node's
++  phandle.  References may by '&' followed by a node's label:
+ 	e.g. interrupt-parent = < &mpic >;
+   or they may be '&' followed by a node's full path in braces:
+ 	e.g. interrupt-parent = < &{/soc/interrupt-controller@40000} >;
++  References are only permitted in arrays that have an element size of
++  32-bits.
+ 
+-* Outside a cell array, a reference to another node will be expanded
+-  to that node's full path.
++* Outside an array, a reference to another node will be expanded to that
++  node's full path.
+ 	e.g. ethernet0 = &EMAC0;
+ 
+ * Labels may also appear before or after any component of a property
+-  value, or between cells of a cell array, or between bytes of a
+-  bytestring.
++  value, or between elements of an array, or between bytes of a bytestring.
+ 	e.g. reg = reglabel: <0 sizelabel: 0x1000000>;
+ 	e.g. prop = [ab cd ef byte4: 00 ff fe];
+ 	e.g. str = start: "string value" end: ;
+@@ -108,3 +119,4 @@ Version 1 DTS files have the overall layout:
+ 
+ 	-- David Gibson <david@gibson.dropbear.id.au>
+ 	-- Yoder Stuart <stuart.yoder@freescale.com>
++	-- Anton Staaf <robotboy@chromium.org>
+diff --git a/dtc-lexer.l b/dtc-lexer.l
+index 494e342..73d190c 100644
+--- a/dtc-lexer.l
++++ b/dtc-lexer.l
+@@ -97,6 +97,12 @@ static int pop_input_file(void);
+ 			return DT_MEMRESERVE;
+ 		}
+ 
++<*>"/bits/"	{
++			DPRINT("Keyword: /bits/\n");
++			BEGIN_DEFAULT();
++			return DT_BITS;
++		}
++
+ <*>{LABEL}:	{
+ 			DPRINT("Label: %s\n", yytext);
+ 			yylval.labelref = xstrdup(yytext);
+diff --git a/dtc-parser.y b/dtc-parser.y
+index 554f11a..348616b 100644
+--- a/dtc-parser.y
++++ b/dtc-parser.y
+@@ -45,8 +45,12 @@ static unsigned char eval_char_literal(const char *s);
+ 	uint8_t byte;
+ 	struct data data;
+ 
++	struct {
++		struct data	data;
++		int		bits;
++	} array;
++
+ 	uint64_t addr;
+-	cell_t cell;
+ 	struct property *prop;
+ 	struct property *proplist;
+ 	struct node *node;
+@@ -56,6 +60,7 @@ static unsigned char eval_char_literal(const char *s);
+ 
+ %token DT_V1
+ %token DT_MEMRESERVE
++%token DT_BITS
+ %token <propnodename> DT_PROPNODENAME
+ %token <literal> DT_LITERAL
+ %token <literal> DT_CHAR_LITERAL
+@@ -71,8 +76,7 @@ static unsigned char eval_char_literal(const char *s);
+ %type <re> memreserve
+ %type <re> memreserves
+ %type <addr> addr
+-%type <data> celllist
+-%type <cell> cellval
++%type <array> arrayprefix
+ %type <data> bytestring
+ %type <prop> propdef
+ %type <proplist> proplist
+@@ -182,9 +186,9 @@ propdata:
+ 		{
+ 			$$ = data_merge($1, $2);
+ 		}
+-	| propdataprefix '<' celllist '>'
++	| propdataprefix arrayprefix '>'
+ 		{
+-			$$ = data_merge($1, $3);
++			$$ = data_merge($1, $2.data);
+ 		}
+ 	| propdataprefix '[' bytestring ']'
+ 		{
+@@ -242,34 +246,56 @@ propdataprefix:
+ 		}
+ 	;
+ 
+-celllist:
+-	  /* empty */
++arrayprefix:
++	DT_BITS DT_LITERAL '<'
+ 		{
+-			$$ = empty_data;
++			$$.data = empty_data;
++			$$.bits = eval_literal($2, 0, 7);
++
++			if (($$.bits !=  8) &&
++			    ($$.bits != 16) &&
++			    ($$.bits != 32) &&
++			    ($$.bits != 64))
++			{
++				print_error("Only 8, 16, 32 and 64-bit elements"
++					    " are currently supported");
++				$$.bits = 32;
++			}
+ 		}
+-	| celllist cellval
++	| '<'
+ 		{
+-			$$ = data_append_cell($1, $2);
++			$$.data = empty_data;
++			$$.bits = 32;
+ 		}
+-	| celllist DT_REF
++	| arrayprefix DT_LITERAL
+ 		{
+-			$$ = data_append_cell(data_add_marker($1, REF_PHANDLE,
+-							      $2), -1);
++			uint64_t val = eval_literal($2, 0, $1.bits);
++
++			$$.data = data_append_integer($1.data, val, $1.bits);
+ 		}
+-	| celllist DT_LABEL
++	| arrayprefix DT_CHAR_LITERAL
+ 		{
+-			$$ = data_add_marker($1, LABEL, $2);
+-		}
+-	;
++			uint64_t val = eval_char_literal($2);
+ 
+-cellval:
+-	  DT_LITERAL
++			$$.data = data_append_integer($1.data, val, $1.bits);
++		}
++	| arrayprefix DT_REF
+ 		{
+-			$$ = eval_literal($1, 0, 32);
++			uint64_t val = ~0ULL >> (64 - $1.bits);
++
++			if ($1.bits == 32)
++				$1.data = data_add_marker($1.data,
++							  REF_PHANDLE,
++							  $2);
++			else
++				print_error("References are only allowed in "
++					    "arrays with 32-bit elements.");
++
++			$$.data = data_append_integer($1.data, val, $1.bits);
+ 		}
+-	| DT_CHAR_LITERAL
++	| arrayprefix DT_LABEL
+ 		{
+-			$$ = eval_char_literal($1);
++			$$.data = data_add_marker($1.data, LABEL, $2);
+ 		}
+ 	;
+ 
+diff --git a/tests/.gitignore b/tests/.gitignore
+index a3e9bd1..9e062c3 100644
+--- a/tests/.gitignore
++++ b/tests/.gitignore
+@@ -40,6 +40,7 @@
+ /set_name
+ /setprop
+ /setprop_inplace
++/sized_cells
+ /string_escapes
+ /subnode_offset
+ /supernode_atdepth_offset
+diff --git a/tests/Makefile.tests b/tests/Makefile.tests
+index cae8390..215a8c5 100644
+--- a/tests/Makefile.tests
++++ b/tests/Makefile.tests
+@@ -6,6 +6,7 @@ LIB_TESTS_L = get_mem_rsv \
+ 	node_check_compatible node_offset_by_compatible \
+ 	get_alias \
+ 	char_literal \
++	sized_cells \
+ 	notfound \
+ 	setprop_inplace nop_property nop_node \
+ 	sw_tree1 \
+diff --git a/tests/run_tests.sh b/tests/run_tests.sh
+index e2c3046..da6f970 100755
+--- a/tests/run_tests.sh
++++ b/tests/run_tests.sh
+@@ -209,6 +209,9 @@ dtc_tests () {
+     run_dtc_test -I dts -O dtb -o dtc_char_literal.test.dtb char_literal.dts
+     run_test char_literal dtc_char_literal.test.dtb
+ 
++    run_dtc_test -I dts -O dtb -o dtc_sized_cells.test.dtb sized_cells.dts
++    run_test sized_cells dtc_sized_cells.test.dtb
++
+     run_dtc_test -I dts -O dtb -o dtc_extra-terminating-null.test.dtb extra-terminating-null.dts
+     run_test extra-terminating-null dtc_extra-terminating-null.test.dtb
+ 
+diff --git a/tests/sized_cells.c b/tests/sized_cells.c
+new file mode 100644
+index 0000000..847ec96
+--- /dev/null
++++ b/tests/sized_cells.c
+@@ -0,0 +1,84 @@
++/*
++ * libfdt - Flat Device Tree manipulation
++ *	Testcase for variable sized cells in dtc
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ * Copyright (C) 2011 The Chromium Authors. All rights reserved.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public License
++ * as published by the Free Software Foundation; either version 2.1 of
++ * the License, or (at your option) any later version.
++ *
++ * This library 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++#include <stdlib.h>
++#include <stdio.h>
++#include <string.h>
++#include <stdint.h>
++
++#include <fdt.h>
++#include <libfdt.h>
++
++#include "tests.h"
++#include "testdata.h"
++
++static void check_compare_properties(void *fdt,
++				     char const *name_one,
++				     char const *name_two)
++{
++	const void *propval;
++	int proplen;
++
++	propval = fdt_getprop(fdt, 0, name_one, &proplen);
++
++	if (!propval)
++		FAIL("fdt_getprop(\"%s\"): %s",
++		     name_one,
++		     fdt_strerror(proplen));
++
++	check_getprop(fdt, 0, name_two, proplen, propval);
++}
++
++int main(int argc, char *argv[])
++{
++	void *fdt;
++	uint8_t expected_8[6] = {TEST_CHAR1,
++				 TEST_CHAR2,
++				 TEST_CHAR3,
++				 TEST_CHAR4,
++				 TEST_CHAR5,
++				 TEST_VALUE_1 >> 24};
++	uint16_t expected_16[6];
++	uint32_t expected_32[6];
++	uint64_t expected_64[6];
++	int i;
++
++	for (i = 0; i < 5; ++i) {
++		expected_16[i] = cpu_to_fdt16(expected_8[i]);
++		expected_32[i] = cpu_to_fdt32(expected_8[i]);
++		expected_64[i] = cpu_to_fdt64(expected_8[i]);
++	}
++
++	expected_16[5] = cpu_to_fdt16(TEST_VALUE_1 >> 16);
++	expected_32[5] = cpu_to_fdt32(TEST_VALUE_1);
++	expected_64[5] = cpu_to_fdt64(TEST_ADDR_1);
++
++	test_init(argc, argv);
++	fdt = load_blob_arg(argc, argv);
++
++	check_getprop(fdt, 0, "cells-8b", sizeof(expected_8), expected_8);
++	check_getprop(fdt, 0, "cells-16b", sizeof(expected_16), expected_16);
++	check_getprop(fdt, 0, "cells-32b", sizeof(expected_32), expected_32);
++	check_getprop(fdt, 0, "cells-64b", sizeof(expected_64), expected_64);
++
++	check_compare_properties(fdt, "cells-one-16b", "cells-one-32b");
++
++	PASS();
++}
+diff --git a/tests/sized_cells.dts b/tests/sized_cells.dts
+new file mode 100644
+index 0000000..efea9f5
+--- /dev/null
++++ b/tests/sized_cells.dts
+@@ -0,0 +1,11 @@
++/dts-v1/;
++
++/ {
++	cells-8b = /bits/ 8 <'\r' 'b' '\0' '\'' '\xff' 0xde>;
++	cells-16b = /bits/ 16 <'\r' 'b' '\0' '\'' '\xff' 0xdead>;
++	cells-32b = /bits/ 32 <'\r' 'b' '\0' '\'' '\xff' 0xdeadbeef>;
++	cells-64b = /bits/ 64 <'\r' 'b' '\0' '\'' '\xff' 0xdeadbeef00000000>;
++
++	cells-one-16b = /bits/ 16 <0x1234 0x5678 0x0 0xffff>;
++	cells-one-32b = <0x12345678 0x0000ffff>;
++};
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/16_fdtdump-rename-from-ftdump.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/16_fdtdump-rename-from-ftdump.patch
@@ -0,0 +1,438 @@
+From: Mike Frysinger <vapier@gentoo.org>
+Date: Tue, 25 Oct 2011 21:29:24 +0000 (-0400)
+Subject: fdtdump: rename from ftdump
+X-Git-Url: http://git.jdl.com/gitweb/?p=dtc.git;a=commitdiff_plain;h=8f459c5d72673e1a3a119ac58a7eee56236fca73
+
+fdtdump: rename from ftdump
+
+The freetype package already installs a binary named "ftdump", so the dtc
+package conflicts with that.  So rename the newer dtc tool to "fdtdump".
+This even makes a bit more sense:
+	ftdump: [F]lat device [T]ree [dump]
+	fdtdump: [F]lat [D]evice [T]ree [dump]
+
+Signed-off-by: Mike Frysinger <vapier@gentoo.org>
+Acked-by: David Gibson <david@gibson.dropbear.id.au>
+---
+
+Index: device-tree-compiler-1.3.0/.gitignore
+===================================================================
+--- device-tree-compiler-1.3.0.orig/.gitignore	2012-01-30 15:03:30.095993353 +0100
++++ device-tree-compiler-1.3.0/.gitignore	2012-01-30 15:03:34.487993309 +0100
+@@ -7,6 +7,6 @@
+ lex.yy.c
+ *.lex.c
+ /dtc
+-/ftdump
++/fdtdump
+ /convert-dtsv0
+ /version_gen.h
+Index: device-tree-compiler-1.3.0/Documentation/manual.txt
+===================================================================
+--- device-tree-compiler-1.3.0.orig/Documentation/manual.txt	2012-01-30 15:03:30.075993336 +0100
++++ device-tree-compiler-1.3.0/Documentation/manual.txt	2012-01-30 15:03:34.487993309 +0100
+@@ -21,7 +21,7 @@
+ 
+ IV - Utility Tools
+     1) convert-dtsv0 -- Conversion to Version 1
+-    1) ftdump
++    1) fdtdump
+ 
+ 
+ I - "dtc", the device tree compiler
+@@ -643,10 +643,10 @@
+ Comments, empty lines, etc. are preserved.
+ 
+ 
+-2) ftdump -- Flat Tree dumping utility
++2) fdtdump -- Flat Device Tree dumping utility
+ 
+-The ftdump program prints a readable version of a flat device tree file.
++The fdtdump program prints a readable version of a flat device tree file.
+ 
+-The syntax of the ftdump command line is:
++The syntax of the fdtdump command line is:
+ 
+-    ftdump <DTB-file-name>
++    fdtdump <DTB-file-name>
+Index: device-tree-compiler-1.3.0/Makefile
+===================================================================
+--- device-tree-compiler-1.3.0.orig/Makefile	2012-01-30 15:03:30.023993406 +0100
++++ device-tree-compiler-1.3.0/Makefile	2012-01-30 15:03:34.487993309 +0100
+@@ -109,7 +109,7 @@
+ 
+ BIN += convert-dtsv0
+ BIN += dtc
+-BIN += ftdump
++BIN += fdtdump
+ 
+ SCRIPTS = dtdiff
+ 
+@@ -119,7 +119,7 @@
+ ifneq ($(DEPTARGETS),)
+ -include $(DTC_OBJS:%.o=%.d)
+ -include $(CONVERT_OBJS:%.o=%.d)
+--include $(FTDUMP_OBJS:%.o=%.d)
++-include $(FDTDUMP_OBJS:%.o=%.d)
+ endif
+ 
+ 
+@@ -178,7 +178,7 @@
+ 	@$(VECHO) LD $@
+ 	$(LINK.c) -o $@ $^
+ 
+-ftdump:	$(FTDUMP_OBJS)
++fdtdump:	$(FDTDUMP_OBJS)
+ 
+ 
+ #
+Index: device-tree-compiler-1.3.0/Makefile.utils
+===================================================================
+--- device-tree-compiler-1.3.0.orig/Makefile.utils	2012-01-30 15:03:30.043993314 +0100
++++ device-tree-compiler-1.3.0/Makefile.utils	2012-01-30 15:03:34.491993307 +0100
+@@ -3,8 +3,8 @@
+ # be easily embeddable into other systems of Makefiles.
+ #
+ 
+-FTDUMP_SRCS = \
+-	ftdump.c \
++FDTDUMP_SRCS = \
++	fdtdump.c \
+ 	util.c
+ 
+-FTDUMP_OBJS = $(FTDUMP_SRCS:%.c=%.o)
++FDTDUMP_OBJS = $(FDTDUMP_SRCS:%.c=%.o)
+Index: device-tree-compiler-1.3.0/ftdump.c
+===================================================================
+--- device-tree-compiler-1.3.0.orig/ftdump.c	2012-01-30 15:03:30.059993370 +0100
++++ /dev/null	1970-01-01 00:00:00.000000000 +0000
+@@ -1,162 +0,0 @@
+-/*
+- * ftdump.c - Contributed by Pantelis Antoniou <pantelis.antoniou AT gmail.com>
+- */
+-
+-#include <stdint.h>
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <string.h>
+-#include <ctype.h>
+-
+-#include <fdt.h>
+-#include <libfdt_env.h>
+-
+-#include "util.h"
+-
+-#define ALIGN(x, a)	(((x) + ((a) - 1)) & ~((a) - 1))
+-#define PALIGN(p, a)	((void *)(ALIGN((unsigned long)(p), (a))))
+-#define GET_CELL(p)	(p += 4, *((const uint32_t *)(p-4)))
+-
+-static void print_data(const char *data, int len)
+-{
+-	int i;
+-	const char *p = data;
+-
+-	/* no data, don't print */
+-	if (len == 0)
+-		return;
+-
+-	if (util_is_printable_string(data, len)) {
+-		printf(" = \"%s\"", (const char *)data);
+-	} else if ((len % 4) == 0) {
+-		printf(" = <");
+-		for (i = 0; i < len; i += 4)
+-			printf("0x%08x%s", fdt32_to_cpu(GET_CELL(p)),
+-			       i < (len - 4) ? " " : "");
+-		printf(">");
+-	} else {
+-		printf(" = [");
+-		for (i = 0; i < len; i++)
+-			printf("%02x%s", *p++, i < len - 1 ? " " : "");
+-		printf("]");
+-	}
+-}
+-
+-static void dump_blob(void *blob)
+-{
+-	struct fdt_header *bph = blob;
+-	uint32_t off_mem_rsvmap = fdt32_to_cpu(bph->off_mem_rsvmap);
+-	uint32_t off_dt = fdt32_to_cpu(bph->off_dt_struct);
+-	uint32_t off_str = fdt32_to_cpu(bph->off_dt_strings);
+-	struct fdt_reserve_entry *p_rsvmap =
+-		(struct fdt_reserve_entry *)((char *)blob + off_mem_rsvmap);
+-	const char *p_struct = (const char *)blob + off_dt;
+-	const char *p_strings = (const char *)blob + off_str;
+-	uint32_t version = fdt32_to_cpu(bph->version);
+-	uint32_t totalsize = fdt32_to_cpu(bph->totalsize);
+-	uint32_t tag;
+-	const char *p, *s, *t;
+-	int depth, sz, shift;
+-	int i;
+-	uint64_t addr, size;
+-
+-	depth = 0;
+-	shift = 4;
+-
+-	printf("/dts-v1/;\n");
+-	printf("// magic:\t\t0x%x\n", fdt32_to_cpu(bph->magic));
+-	printf("// totalsize:\t\t0x%x (%d)\n", totalsize, totalsize);
+-	printf("// off_dt_struct:\t0x%x\n", off_dt);
+-	printf("// off_dt_strings:\t0x%x\n", off_str);
+-	printf("// off_mem_rsvmap:\t0x%x\n", off_mem_rsvmap);
+-	printf("// version:\t\t%d\n", version);
+-	printf("// last_comp_version:\t%d\n",
+-	       fdt32_to_cpu(bph->last_comp_version));
+-	if (version >= 2)
+-		printf("// boot_cpuid_phys:\t0x%x\n",
+-		       fdt32_to_cpu(bph->boot_cpuid_phys));
+-
+-	if (version >= 3)
+-		printf("// size_dt_strings:\t0x%x\n",
+-		       fdt32_to_cpu(bph->size_dt_strings));
+-	if (version >= 17)
+-		printf("// size_dt_struct:\t0x%x\n",
+-		       fdt32_to_cpu(bph->size_dt_struct));
+-	printf("\n");
+-
+-	for (i = 0; ; i++) {
+-		addr = fdt64_to_cpu(p_rsvmap[i].address);
+-		size = fdt64_to_cpu(p_rsvmap[i].size);
+-		if (addr == 0 && size == 0)
+-			break;
+-
+-		printf("/memreserve/ %llx %llx;\n",
+-		       (unsigned long long)addr, (unsigned long long)size);
+-	}
+-
+-	p = p_struct;
+-	while ((tag = fdt32_to_cpu(GET_CELL(p))) != FDT_END) {
+-
+-		/* printf("tag: 0x%08x (%d)\n", tag, p - p_struct); */
+-
+-		if (tag == FDT_BEGIN_NODE) {
+-			s = p;
+-			p = PALIGN(p + strlen(s) + 1, 4);
+-
+-			if (*s == '\0')
+-				s = "/";
+-
+-			printf("%*s%s {\n", depth * shift, "", s);
+-
+-			depth++;
+-			continue;
+-		}
+-
+-		if (tag == FDT_END_NODE) {
+-			depth--;
+-
+-			printf("%*s};\n", depth * shift, "");
+-			continue;
+-		}
+-
+-		if (tag == FDT_NOP) {
+-			printf("%*s// [NOP]\n", depth * shift, "");
+-			continue;
+-		}
+-
+-		if (tag != FDT_PROP) {
+-			fprintf(stderr, "%*s ** Unknown tag 0x%08x\n", depth * shift, "", tag);
+-			break;
+-		}
+-		sz = fdt32_to_cpu(GET_CELL(p));
+-		s = p_strings + fdt32_to_cpu(GET_CELL(p));
+-		if (version < 16 && sz >= 8)
+-			p = PALIGN(p, 8);
+-		t = p;
+-
+-		p = PALIGN(p + sz, 4);
+-
+-		printf("%*s%s", depth * shift, "", s);
+-		print_data(t, sz);
+-		printf(";\n");
+-	}
+-}
+-
+-
+-int main(int argc, char *argv[])
+-{
+-	char *buf;
+-
+-	if (argc < 2) {
+-		fprintf(stderr, "supply input filename\n");
+-		return 5;
+-	}
+-
+-	buf = utilfdt_read(argv[1]);
+-	if (buf)
+-		dump_blob(buf);
+-	else
+-		return 10;
+-
+-	return 0;
+-}
+Index: device-tree-compiler-1.3.0/fdtdump.c
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ device-tree-compiler-1.3.0/fdtdump.c	2012-01-30 15:04:46.255989457 +0100
+@@ -0,0 +1,162 @@
++/*
++ * fdtdump.c - Contributed by Pantelis Antoniou <pantelis.antoniou AT gmail.com>
++ */
++
++#include <stdint.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <ctype.h>
++
++#include <fdt.h>
++#include <libfdt_env.h>
++
++#include "util.h"
++
++#define ALIGN(x, a)	(((x) + ((a) - 1)) & ~((a) - 1))
++#define PALIGN(p, a)	((void *)(ALIGN((unsigned long)(p), (a))))
++#define GET_CELL(p)	(p += 4, *((const uint32_t *)(p-4)))
++
++static void print_data(const char *data, int len)
++{
++	int i;
++	const char *p = data;
++
++	/* no data, don't print */
++	if (len == 0)
++		return;
++
++	if (util_is_printable_string(data, len)) {
++		printf(" = \"%s\"", (const char *)data);
++	} else if ((len % 4) == 0) {
++		printf(" = <");
++		for (i = 0; i < len; i += 4)
++			printf("0x%08x%s", fdt32_to_cpu(GET_CELL(p)),
++			       i < (len - 4) ? " " : "");
++		printf(">");
++	} else {
++		printf(" = [");
++		for (i = 0; i < len; i++)
++			printf("%02x%s", *p++, i < len - 1 ? " " : "");
++		printf("]");
++	}
++}
++
++static void dump_blob(void *blob)
++{
++	struct fdt_header *bph = blob;
++	uint32_t off_mem_rsvmap = fdt32_to_cpu(bph->off_mem_rsvmap);
++	uint32_t off_dt = fdt32_to_cpu(bph->off_dt_struct);
++	uint32_t off_str = fdt32_to_cpu(bph->off_dt_strings);
++	struct fdt_reserve_entry *p_rsvmap =
++		(struct fdt_reserve_entry *)((char *)blob + off_mem_rsvmap);
++	const char *p_struct = (const char *)blob + off_dt;
++	const char *p_strings = (const char *)blob + off_str;
++	uint32_t version = fdt32_to_cpu(bph->version);
++	uint32_t totalsize = fdt32_to_cpu(bph->totalsize);
++	uint32_t tag;
++	const char *p, *s, *t;
++	int depth, sz, shift;
++	int i;
++	uint64_t addr, size;
++
++	depth = 0;
++	shift = 4;
++
++	printf("/dts-v1/;\n");
++	printf("// magic:\t\t0x%x\n", fdt32_to_cpu(bph->magic));
++	printf("// totalsize:\t\t0x%x (%d)\n", totalsize, totalsize);
++	printf("// off_dt_struct:\t0x%x\n", off_dt);
++	printf("// off_dt_strings:\t0x%x\n", off_str);
++	printf("// off_mem_rsvmap:\t0x%x\n", off_mem_rsvmap);
++	printf("// version:\t\t%d\n", version);
++	printf("// last_comp_version:\t%d\n",
++	       fdt32_to_cpu(bph->last_comp_version));
++	if (version >= 2)
++		printf("// boot_cpuid_phys:\t0x%x\n",
++		       fdt32_to_cpu(bph->boot_cpuid_phys));
++
++	if (version >= 3)
++		printf("// size_dt_strings:\t0x%x\n",
++		       fdt32_to_cpu(bph->size_dt_strings));
++	if (version >= 17)
++		printf("// size_dt_struct:\t0x%x\n",
++		       fdt32_to_cpu(bph->size_dt_struct));
++	printf("\n");
++
++	for (i = 0; ; i++) {
++		addr = fdt64_to_cpu(p_rsvmap[i].address);
++		size = fdt64_to_cpu(p_rsvmap[i].size);
++		if (addr == 0 && size == 0)
++			break;
++
++		printf("/memreserve/ %llx %llx;\n",
++		       (unsigned long long)addr, (unsigned long long)size);
++	}
++
++	p = p_struct;
++	while ((tag = fdt32_to_cpu(GET_CELL(p))) != FDT_END) {
++
++		/* printf("tag: 0x%08x (%d)\n", tag, p - p_struct); */
++
++		if (tag == FDT_BEGIN_NODE) {
++			s = p;
++			p = PALIGN(p + strlen(s) + 1, 4);
++
++			if (*s == '\0')
++				s = "/";
++
++			printf("%*s%s {\n", depth * shift, "", s);
++
++			depth++;
++			continue;
++		}
++
++		if (tag == FDT_END_NODE) {
++			depth--;
++
++			printf("%*s};\n", depth * shift, "");
++			continue;
++		}
++
++		if (tag == FDT_NOP) {
++			printf("%*s// [NOP]\n", depth * shift, "");
++			continue;
++		}
++
++		if (tag != FDT_PROP) {
++			fprintf(stderr, "%*s ** Unknown tag 0x%08x\n", depth * shift, "", tag);
++			break;
++		}
++		sz = fdt32_to_cpu(GET_CELL(p));
++		s = p_strings + fdt32_to_cpu(GET_CELL(p));
++		if (version < 16 && sz >= 8)
++			p = PALIGN(p, 8);
++		t = p;
++
++		p = PALIGN(p + sz, 4);
++
++		printf("%*s%s", depth * shift, "", s);
++		print_data(t, sz);
++		printf(";\n");
++	}
++}
++
++
++int main(int argc, char *argv[])
++{
++	char *buf;
++
++	if (argc < 2) {
++		fprintf(stderr, "supply input filename\n");
++		return 5;
++	}
++
++	buf = utilfdt_read(argv[1]);
++	if (buf)
++		dump_blob(buf);
++	else
++		return 10;
++
++	return 0;
++}
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/17_libfdt-Add-support-for-appending-the-values-to-a-exi.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/17_libfdt-Add-support-for-appending-the-values-to-a-exi.patch
@@ -0,0 +1,331 @@
+From a31e3ef83bfce62d07695355e5f06cd4d0e44b86 Mon Sep 17 00:00:00 2001
+From: Minghuan Lian <Minghuan.Lian@freescale.com>
+Date: Mon, 5 Dec 2011 12:22:07 +1100
+Subject: [PATCH 2/7] libfdt: Add support for appending the values to a
+ existing property
+
+Some properties may contain multiple values, these values may need
+to be added to the property respectively. this patch provides this
+functionality. The main purpose of fdt_append_prop() is to append
+the values to a existing property, or create a new property if it
+dose not exist.
+
+Signed-off-by: Minghuan Lian <Minghuan.Lian@freescale.com>
+Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
+---
+ libfdt/fdt_rw.c      |   27 ++++++++++++++
+ libfdt/libfdt.h      |   95 ++++++++++++++++++++++++++++++++++++++++++++++++++
+ tests/appendprop.dts |    7 ++++
+ tests/appendprop1.c  |   70 ++++++++++++++++++++++++++++++++++++
+ tests/appendprop2.c  |   64 +++++++++++++++++++++++++++++++++
+ 5 files changed, 263 insertions(+), 0 deletions(-)
+ create mode 100644 tests/appendprop.dts
+ create mode 100644 tests/appendprop1.c
+ create mode 100644 tests/appendprop2.c
+
+diff --git a/libfdt/fdt_rw.c b/libfdt/fdt_rw.c
+index 994037b..24437df 100644
+--- a/libfdt/fdt_rw.c
++++ b/libfdt/fdt_rw.c
+@@ -289,6 +289,33 @@ int fdt_setprop(void *fdt, int nodeoffset, const char *name,
+ 	return 0;
+ }
+ 
++int fdt_appendprop(void *fdt, int nodeoffset, const char *name,
++		   const void *val, int len)
++{
++	struct fdt_property *prop;
++	int err, oldlen, newlen;
++
++	FDT_RW_CHECK_HEADER(fdt);
++
++	prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen);
++	if (prop) {
++		newlen = len + oldlen;
++		err = _fdt_splice_struct(fdt, prop->data,
++					 FDT_TAGALIGN(oldlen),
++					 FDT_TAGALIGN(newlen));
++		if (err)
++			return err;
++		prop->len = cpu_to_fdt32(newlen);
++		memcpy(prop->data + oldlen, val, len);
++	} else {
++		err = _fdt_add_property(fdt, nodeoffset, name, len, &prop);
++		if (err)
++			return err;
++		memcpy(prop->data, val, len);
++	}
++	return 0;
++}
++
+ int fdt_delprop(void *fdt, int nodeoffset, const char *name)
+ {
+ 	struct fdt_property *prop;
+diff --git a/libfdt/libfdt.h b/libfdt/libfdt.h
+index 55f3eb3..060479e 100644
+--- a/libfdt/libfdt.h
++++ b/libfdt/libfdt.h
+@@ -1134,6 +1134,101 @@ static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name,
+ 	fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
+ 
+ /**
++ * fdt_appendprop - append to or create a property
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose property to change
++ * @name: name of the property to append to
++ * @val: pointer to data to append to the property value
++ * @len: length of the data to append to the property value
++ *
++ * fdt_appendprop() appends the value to the named property in the
++ * given node, creating the property if it does not already exist.
++ *
++ * This function may insert data into the blob, and will therefore
++ * change the offsets of some existing nodes.
++ *
++ * returns:
++ *	0, on success
++ *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
++ *		contain the new property value
++ *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ *	-FDT_ERR_BADLAYOUT,
++ *	-FDT_ERR_BADMAGIC,
++ *	-FDT_ERR_BADVERSION,
++ *	-FDT_ERR_BADSTATE,
++ *	-FDT_ERR_BADSTRUCTURE,
++ *	-FDT_ERR_BADLAYOUT,
++ *	-FDT_ERR_TRUNCATED, standard meanings
++ */
++int fdt_appendprop(void *fdt, int nodeoffset, const char *name,
++		   const void *val, int len);
++
++/**
++ * fdt_appendprop_cell - append a single cell value to a property
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose property to change
++ * @name: name of the property to change
++ * @val: 32-bit integer value to append to the property (native endian)
++ *
++ * fdt_appendprop_cell() appends the given cell value (converting to
++ * big-endian if necessary) to the value of the named property in the
++ * given node, or creates a new property with that value if it does
++ * not already exist.
++ *
++ * This function may insert data into the blob, and will therefore
++ * change the offsets of some existing nodes.
++ *
++ * returns:
++ *	0, on success
++ *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
++ *		contain the new property value
++ *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ *	-FDT_ERR_BADLAYOUT,
++ *	-FDT_ERR_BADMAGIC,
++ *	-FDT_ERR_BADVERSION,
++ *	-FDT_ERR_BADSTATE,
++ *	-FDT_ERR_BADSTRUCTURE,
++ *	-FDT_ERR_BADLAYOUT,
++ *	-FDT_ERR_TRUNCATED, standard meanings
++ */
++static inline int fdt_appendprop_cell(void *fdt, int nodeoffset,
++				      const char *name, uint32_t val)
++{
++	val = cpu_to_fdt32(val);
++	return fdt_appendprop(fdt, nodeoffset, name, &val, sizeof(val));
++}
++
++/**
++ * fdt_appendprop_string - append a string to a property
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose property to change
++ * @name: name of the property to change
++ * @str: string value to append to the property
++ *
++ * fdt_appendprop_string() appends the given string to the value of
++ * the named property in the given node, or creates a new property
++ * with that value if it does not already exist.
++ *
++ * This function may insert data into the blob, and will therefore
++ * change the offsets of some existing nodes.
++ *
++ * returns:
++ *	0, on success
++ *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
++ *		contain the new property value
++ *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ *	-FDT_ERR_BADLAYOUT,
++ *	-FDT_ERR_BADMAGIC,
++ *	-FDT_ERR_BADVERSION,
++ *	-FDT_ERR_BADSTATE,
++ *	-FDT_ERR_BADSTRUCTURE,
++ *	-FDT_ERR_BADLAYOUT,
++ *	-FDT_ERR_TRUNCATED, standard meanings
++ */
++#define fdt_appendprop_string(fdt, nodeoffset, name, str) \
++	fdt_appendprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
++
++/**
+  * fdt_delprop - delete a property
+  * @fdt: pointer to the device tree blob
+  * @nodeoffset: offset of the node whose property to nop
+diff --git a/tests/appendprop.dts b/tests/appendprop.dts
+new file mode 100644
+index 0000000..6e3a3eb
+--- /dev/null
++++ b/tests/appendprop.dts
+@@ -0,0 +1,7 @@
++/dts-v1/;
++
++/ {
++	prop-str = "hello world", "nastystring: \a\b\t\n\v\f\r\\\"";
++	prop-int = <0xdeadbeef 123456789>;
++	prop-bytes = [00010203040001020304];
++};
+diff --git a/tests/appendprop1.c b/tests/appendprop1.c
+new file mode 100644
+index 0000000..180d296
+--- /dev/null
++++ b/tests/appendprop1.c
+@@ -0,0 +1,70 @@
++/*
++ * libfdt - Flat Device Tree manipulation
++ *	Testcase for fdt_appendprop()
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public License
++ * as published by the Free Software Foundation; either version 2.1 of
++ * the License, or (at your option) any later version.
++ *
++ * This library 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <string.h>
++#include <ctype.h>
++#include <stdint.h>
++
++#include <fdt.h>
++#include <libfdt.h>
++
++#include "tests.h"
++#include "testdata.h"
++
++#define SPACE		65536
++
++#define CHECK(code) \
++	{ \
++		err = (code); \
++		if (err) \
++			FAIL(#code ": %s", fdt_strerror(err)); \
++	}
++
++int main(int argc, char *argv[])
++{
++	void *fdt;
++	int err;
++	uint8_t bytes[] = {0x00, 0x01, 0x02, 0x03, 0x04};
++
++	test_init(argc, argv);
++
++	/* Create an empty tree first */
++	fdt = xmalloc(SPACE);
++	CHECK(fdt_create(fdt, SPACE));
++	CHECK(fdt_finish_reservemap(fdt));
++	CHECK(fdt_begin_node(fdt, ""));
++	CHECK(fdt_end_node(fdt));
++	CHECK(fdt_finish(fdt));
++
++	/* Now use appendprop to add properties */
++	CHECK(fdt_open_into(fdt, fdt, SPACE));
++
++	CHECK(fdt_appendprop(fdt, 0, "prop-bytes", bytes, sizeof(bytes)));
++	CHECK(fdt_appendprop_cell(fdt, 0, "prop-int", TEST_VALUE_1));
++	CHECK(fdt_appendprop_string(fdt, 0, "prop-str", TEST_STRING_1));
++
++	CHECK(fdt_pack(fdt));
++
++	save_blob("appendprop1.test.dtb", fdt);
++
++	PASS();
++}
+diff --git a/tests/appendprop2.c b/tests/appendprop2.c
+new file mode 100644
+index 0000000..d651a89
+--- /dev/null
++++ b/tests/appendprop2.c
+@@ -0,0 +1,64 @@
++/*
++ * libfdt - Flat Device Tree manipulation
++ *	Testcase for fdt_appendprop()
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public License
++ * as published by the Free Software Foundation; either version 2.1 of
++ * the License, or (at your option) any later version.
++ *
++ * This library 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <string.h>
++#include <ctype.h>
++#include <stdint.h>
++
++#include <fdt.h>
++#include <libfdt.h>
++
++#include "tests.h"
++#include "testdata.h"
++
++#define SPACE		65536
++
++#define CHECK(code) \
++	{ \
++		err = (code); \
++		if (err) \
++			FAIL(#code ": %s", fdt_strerror(err)); \
++	}
++
++int main(int argc, char *argv[])
++{
++	void *fdt, *buf;
++	int err;
++	uint8_t bytes[] = {0x00, 0x01, 0x02, 0x03, 0x04};
++
++	test_init(argc, argv);
++	fdt = load_blob_arg(argc, argv);
++
++	buf = xmalloc(SPACE);
++	CHECK(fdt_open_into(fdt, buf, SPACE));
++	fdt = buf;
++
++	CHECK(fdt_appendprop(fdt, 0, "prop-bytes", bytes, sizeof(bytes)));
++	CHECK(fdt_appendprop_cell(fdt, 0, "prop-int", TEST_VALUE_2));
++	CHECK(fdt_appendprop_string(fdt, 0, "prop-str", TEST_STRING_2));
++
++	CHECK(fdt_pack(fdt));
++
++	save_blob("appendprop2.test.dtb", fdt);
++
++	PASS();
++}
+-- 
+1.7.8.3
+
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/18_libfdt-Activate-testcase-for-appending-properties.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/18_libfdt-Activate-testcase-for-appending-properties.patch
@@ -0,0 +1,48 @@
+From 97b909f852039daaae267a66f5df2c90ed05b586 Mon Sep 17 00:00:00 2001
+From: David Gibson <david@gibson.dropbear.id.au>
+Date: Wed, 11 Jan 2012 23:41:32 +1100
+Subject: [PATCH 3/7] libfdt: Activate testcase for appending properties
+
+Commit a31e3ef83bfce62d07695355e5f06cd4d0e44b86 introduced new libfdt
+functions to append to existing properties.  It also included a test case
+for this, but neglected to update the Makefile and run_tests.sh script
+to actually build and execute this testcase.
+
+This patch corrects the oversight.
+
+Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
+---
+ tests/Makefile.tests |    1 +
+ tests/run_tests.sh   |    4 ++++
+ 2 files changed, 5 insertions(+), 0 deletions(-)
+
+diff --git a/tests/Makefile.tests b/tests/Makefile.tests
+index 215a8c5..3f92074 100644
+--- a/tests/Makefile.tests
++++ b/tests/Makefile.tests
+@@ -12,6 +12,7 @@ LIB_TESTS_L = get_mem_rsv \
+ 	sw_tree1 \
+ 	move_and_save mangle-layout nopulate \
+ 	open_pack rw_tree1 set_name setprop del_property del_node \
++	appendprop1 appendprop2 \
+ 	string_escapes references path-references phandle_format \
+ 	boot-cpuid incbin \
+ 	extra-terminating-null \
+diff --git a/tests/run_tests.sh b/tests/run_tests.sh
+index da6f970..c72b9d2 100755
+--- a/tests/run_tests.sh
++++ b/tests/run_tests.sh
+@@ -178,6 +178,10 @@ libfdt_tests () {
+     run_test rw_tree1
+     tree1_tests rw_tree1.test.dtb
+     tree1_tests_rw rw_tree1.test.dtb
++    run_test appendprop1
++    run_test appendprop2 appendprop1.test.dtb
++    run_dtc_test -I dts -O dtb -o appendprop.test.dtb appendprop.dts
++    run_test dtbs_equal_ordered appendprop2.test.dtb appendprop.test.dtb
+ 
+     for basetree in test_tree1.dtb sw_tree1.test.dtb rw_tree1.test.dtb; do
+ 	run_test nopulate $basetree
+-- 
+1.7.8.3
+
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/19_dtc-Implement-d-option-to-write-out-a-dependency-fil.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/19_dtc-Implement-d-option-to-write-out-a-dependency-fil.patch
@@ -0,0 +1,191 @@
+From 69df9f0de25db1c37970850115cdf48335d41802 Mon Sep 17 00:00:00 2001
+From: Stephen Warren <swarren@nvidia.com>
+Date: Thu, 12 Jan 2012 11:31:00 -0700
+Subject: [PATCH 4/7] dtc: Implement -d option to write out a dependency file
+
+This will allow callers to rebuild .dtb files when any of the /include/d
+.dtsi files are modified, not just the top-level .dts file.
+
+Signed-off-by: Stephen Warren <swarren@nvidia.com>
+Acked-by: David Gibson <david@gibson.dropbear.id.au>
+---
+ Documentation/manual.txt |    3 +++
+ dtc.c                    |   20 +++++++++++++++++++-
+ srcpos.c                 |    4 ++++
+ srcpos.h                 |    1 +
+ tests/dependencies.cmp   |    1 +
+ tests/dependencies.dts   |    6 ++++++
+ tests/deps_inc1.dtsi     |    1 +
+ tests/deps_inc2.dtsi     |    1 +
+ tests/run_tests.sh       |    4 ++++
+ 9 files changed, 40 insertions(+), 1 deletions(-)
+ create mode 100644 tests/dependencies.cmp
+ create mode 100644 tests/dependencies.dts
+ create mode 100644 tests/deps_inc1.dtsi
+ create mode 100644 tests/deps_inc2.dtsi
+
+diff --git a/Documentation/manual.txt b/Documentation/manual.txt
+index 14508f3..989c589 100644
+--- a/Documentation/manual.txt
++++ b/Documentation/manual.txt
+@@ -106,6 +106,9 @@ Options:
+     -O <output_format>
+ 	The generated output format, as listed above.
+ 
++    -d <dependency_filename>
++	Generate a dependency file during compilation.
++
+     -q
+ 	Quiet: -q suppress warnings, -qq errors, -qqq all
+ 
+diff --git a/dtc.c b/dtc.c
+index 15d2fc2..7a0c605 100644
+--- a/dtc.c
++++ b/dtc.c
+@@ -71,6 +71,7 @@ static void  __attribute__ ((noreturn)) usage(void)
+ 	fprintf(stderr, "\t\t\tasm - assembler source\n");
+ 	fprintf(stderr, "\t-V <output version>\n");
+ 	fprintf(stderr, "\t\tBlob version to produce, defaults to %d (relevant for dtb\n\t\tand asm output only)\n", DEFAULT_FDT_VERSION);
++	fprintf(stderr, "\t-d <output dependency file>\n");
+ 	fprintf(stderr, "\t-R <number>\n");
+ 	fprintf(stderr, "\t\tMake space for <number> reserve map entries (relevant for \n\t\tdtb and asm output only)\n");
+ 	fprintf(stderr, "\t-S <bytes>\n");
+@@ -99,6 +100,7 @@ int main(int argc, char *argv[])
+ 	const char *inform = "dts";
+ 	const char *outform = "dts";
+ 	const char *outname = "-";
++	const char *depname = NULL;
+ 	int force = 0, sort = 0;
+ 	const char *arg;
+ 	int opt;
+@@ -111,7 +113,7 @@ int main(int argc, char *argv[])
+ 	minsize    = 0;
+ 	padsize    = 0;
+ 
+-	while ((opt = getopt(argc, argv, "hI:O:o:V:R:S:p:fqb:vH:s")) != EOF) {
++	while ((opt = getopt(argc, argv, "hI:O:o:V:d:R:S:p:fqb:vH:s")) != EOF) {
+ 		switch (opt) {
+ 		case 'I':
+ 			inform = optarg;
+@@ -125,6 +127,9 @@ int main(int argc, char *argv[])
+ 		case 'V':
+ 			outversion = strtol(optarg, NULL, 0);
+ 			break;
++		case 'd':
++			depname = optarg;
++			break;
+ 		case 'R':
+ 			reservenum = strtol(optarg, NULL, 0);
+ 			break;
+@@ -185,6 +190,14 @@ int main(int argc, char *argv[])
+ 	fprintf(stderr, "DTC: %s->%s  on file \"%s\"\n",
+ 		inform, outform, arg);
+ 
++	if (depname) {
++		depfile = fopen(depname, "w");
++		if (!depfile)
++			die("Couldn't open dependency file %s: %s\n", depname,
++			    strerror(errno));
++		fprintf(depfile, "%s:", outname);
++	}
++
+ 	if (streq(inform, "dts"))
+ 		bi = dt_from_source(arg);
+ 	else if (streq(inform, "fs"))
+@@ -194,6 +207,11 @@ int main(int argc, char *argv[])
+ 	else
+ 		die("Unknown input format \"%s\"\n", inform);
+ 
++	if (depfile) {
++		fputc('\n', depfile);
++		fclose(depfile);
++	}
++
+ 	if (cmdline_boot_cpuid != -1)
+ 		bi->boot_cpuid_phys = cmdline_boot_cpuid;
+ 
+diff --git a/srcpos.c b/srcpos.c
+index 2dbc874..36a38e9 100644
+--- a/srcpos.c
++++ b/srcpos.c
+@@ -40,6 +40,7 @@ static char *dirname(const char *path)
+ 	return NULL;
+ }
+ 
++FILE *depfile; /* = NULL */
+ struct srcfile_state *current_srcfile; /* = NULL */
+ 
+ /* Detect infinite include recursion. */
+@@ -67,6 +68,9 @@ FILE *srcfile_relative_open(const char *fname, char **fullnamep)
+ 			    strerror(errno));
+ 	}
+ 
++	if (depfile)
++		fprintf(depfile, " %s", fullname);
++
+ 	if (fullnamep)
+ 		*fullnamep = fullname;
+ 	else
+diff --git a/srcpos.h b/srcpos.h
+index bd7966e..ce980ca 100644
+--- a/srcpos.h
++++ b/srcpos.h
+@@ -30,6 +30,7 @@ struct srcfile_state {
+ 	struct srcfile_state *prev;
+ };
+ 
++extern FILE *depfile; /* = NULL */
+ extern struct srcfile_state *current_srcfile; /* = NULL */
+ 
+ FILE *srcfile_relative_open(const char *fname, char **fullnamep);
+diff --git a/tests/dependencies.cmp b/tests/dependencies.cmp
+new file mode 100644
+index 0000000..bcd9432
+--- /dev/null
++++ b/tests/dependencies.cmp
+@@ -0,0 +1 @@
++dependencies.test.dtb: dependencies.dts deps_inc1.dtsi deps_inc2.dtsi
+diff --git a/tests/dependencies.dts b/tests/dependencies.dts
+new file mode 100644
+index 0000000..2cfe31b
+--- /dev/null
++++ b/tests/dependencies.dts
+@@ -0,0 +1,6 @@
++/dts-v1/;
++
++/include/ "deps_inc1.dtsi"
++
++/ {
++};
+diff --git a/tests/deps_inc1.dtsi b/tests/deps_inc1.dtsi
+new file mode 100644
+index 0000000..5c607dc
+--- /dev/null
++++ b/tests/deps_inc1.dtsi
+@@ -0,0 +1 @@
++/include/ "deps_inc2.dtsi"
+diff --git a/tests/deps_inc2.dtsi b/tests/deps_inc2.dtsi
+new file mode 100644
+index 0000000..710cecc
+--- /dev/null
++++ b/tests/deps_inc2.dtsi
+@@ -0,0 +1 @@
++/* Empty */
+diff --git a/tests/run_tests.sh b/tests/run_tests.sh
+index c72b9d2..e42154b 100755
+--- a/tests/run_tests.sh
++++ b/tests/run_tests.sh
+@@ -357,6 +357,10 @@ dtc_tests () {
+     run_sh_test dtc-fatal.sh -I dts -O dtb nosuchfile.dts
+     run_sh_test dtc-fatal.sh -I dtb -O dtb nosuchfile.dtb
+     run_sh_test dtc-fatal.sh -I fs -O dtb nosuchfile
++
++    # Dependencies
++    run_dtc_test -I dts -O dtb -o dependencies.test.dtb -d dependencies.test.d dependencies.dts
++    run_wrap_test cmp dependencies.test.d dependencies.cmp
+ }
+ 
+ cmp_tests () {
+-- 
+1.7.8.3
+
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/20_Add-fdtget-utility-to-read-property-values-from-a-de.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/20_Add-fdtget-utility-to-read-property-values-from-a-de.patch
@@ -0,0 +1,486 @@
+From 68d057f20d7c3a93b441d2892c4749392bc83b45 Mon Sep 17 00:00:00 2001
+From: Simon Glass <sjg@chromium.org>
+Date: Sat, 21 Jan 2012 10:14:47 -0800
+Subject: [PATCH 5/7] Add fdtget utility to read property values from a device
+ tree
+
+This simply utility makes it easy for scripts to read values from the device
+tree. It is written in C and uses the same libfdt as the rest of the dtc
+package.
+
+What is it for:
+- Reading fdt values from scripts
+- Extracting fdt information within build systems
+- Looking at particular values without having to dump the entire tree
+
+To use it, specify the fdt binary file on command line followed by a list of
+node, property pairs. The utility then looks up each node, finds the property
+and displays the value.
+
+Each value is printed on a new line.
+
+fdtget tries to guess the type of each property based on its contents. This
+is not always reliable, so you can use the -t option to force fdtget to decode
+the value as a string, or byte, etc.
+
+To read from stdin, use - as the file.
+
+Usage:
+	fdtget <options> <dt file> [<node> <property>]...
+Options:
+	-t <type>	Type of data
+	-h		Print this help
+
+<type>	s=string, i=int, u=unsigned, x=hex
+	Optional modifier prefix:
+		hh or b=byte, h=2 byte, l=4 byte (default)
+
+Signed-off-by: Simon Glass <sjg@chromium.org>
+---
+ .gitignore              |    1 +
+ Makefile                |    4 +
+ Makefile.utils          |    7 ++
+ fdtget.c                |  226 +++++++++++++++++++++++++++++++++++++++++++++++
+ tests/fdtget-runtest.sh |   35 +++++++
+ tests/run_tests.sh      |   43 +++++++++-
+ tests/tests.sh          |    1 +
+ util.h                  |   10 ++
+ 8 files changed, 326 insertions(+), 1 deletions(-)
+ create mode 100644 fdtget.c
+ create mode 100755 tests/fdtget-runtest.sh
+
+diff --git a/.gitignore b/.gitignore
+index 74714cd..2d82b71 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -10,3 +10,4 @@ lex.yy.c
+ /fdtdump
+ /convert-dtsv0
+ /version_gen.h
++/fdtget
+diff --git a/Makefile b/Makefile
+index 4582f5d..a54a209 100644
+--- a/Makefile
++++ b/Makefile
+@@ -110,6 +110,7 @@ include Makefile.utils
+ BIN += convert-dtsv0
+ BIN += dtc
+ BIN += fdtdump
++BIN += fdtget
+ 
+ SCRIPTS = dtdiff
+ 
+@@ -120,6 +121,7 @@ ifneq ($(DEPTARGETS),)
+ -include $(DTC_OBJS:%.o=%.d)
+ -include $(CONVERT_OBJS:%.o=%.d)
+ -include $(FDTDUMP_OBJS:%.o=%.d)
++-include $(FDTGET_OBJS:%.o=%.d)
+ endif
+ 
+ 
+@@ -180,6 +182,8 @@ convert-dtsv0: $(CONVERT_OBJS)
+ 
+ fdtdump:	$(FDTDUMP_OBJS)
+ 
++fdtget:	$(FDTGET_OBJS) $(LIBFDT_archive)
++
+ 
+ #
+ # Testsuite rules
+diff --git a/Makefile.utils b/Makefile.utils
+index fae5b00..38efa3c 100644
+--- a/Makefile.utils
++++ b/Makefile.utils
+@@ -8,3 +8,10 @@ FDTDUMP_SRCS = \
+ 	util.c
+ 
+ FDTDUMP_OBJS = $(FDTDUMP_SRCS:%.c=%.o)
++
++
++FDTGET_SRCS = \
++	fdtget.c \
++	util.c
++
++FDTGET_OBJS = $(FDTGET_SRCS:%.c=%.o)
+diff --git a/fdtget.c b/fdtget.c
+new file mode 100644
+index 0000000..48ab615
+--- /dev/null
++++ b/fdtget.c
+@@ -0,0 +1,226 @@
++/*
++ * Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
++ *
++ * 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 <ctype.h>
++#include <getopt.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++#include <libfdt.h>
++
++#include "util.h"
++
++/* Holds information which controls our output and options */
++struct display_info {
++	int type;		/* data type (s/i/u/x or 0 for default) */
++	int size;		/* data size (1/2/4) */
++};
++
++static void report_error(const char *where, int err)
++{
++	fprintf(stderr, "Error at '%s': %s\n", where, fdt_strerror(err));
++}
++
++/**
++ * Displays data of a given length according to selected options
++ *
++ * If a specific data type is provided in disp, then this is used. Otherwise
++ * we try to guess the data type / size from the contents.
++ *
++ * @param disp		Display information / options
++ * @param data		Data to display
++ * @param len		Maximum length of buffer
++ * @return 0 if ok, -1 if data does not match format
++ */
++static int show_data(struct display_info *disp, const char *data, int len)
++{
++	int i, size;
++	const uint8_t *p = (const uint8_t *)data;
++	const char *s;
++	int value;
++	int is_string;
++	char fmt[3];
++
++	/* no data, don't print */
++	if (len == 0)
++		return 0;
++
++	is_string = (disp->type) == 's' ||
++		(!disp->type && util_is_printable_string(data, len));
++	if (is_string) {
++		if (data[len - 1] != '\0') {
++			fprintf(stderr, "Unterminated string\n");
++			return -1;
++		}
++		for (s = data; s - data < len; s += strlen(s) + 1) {
++			if (s != data)
++				printf(" ");
++			printf("%s", (const char *)s);
++		}
++		return 0;
++	}
++	size = disp->size;
++	if (size == -1)
++		size = (len % 4) == 0 ? 4 : 1;
++	else if (len % size) {
++		fprintf(stderr, "Property length must be a multiple of "
++				"selected data size\n");
++		return -1;
++	}
++	fmt[0] = '%';
++	fmt[1] = disp->type ? disp->type : 'd';
++	fmt[2] = '\0';
++	for (i = 0; i < len; i += size, p += size) {
++		if (i)
++			printf(" ");
++		value = size == 4 ? fdt32_to_cpu(*(const uint32_t *)p) :
++			size == 2 ? (*p << 8) | p[1] : *p;
++		printf(fmt, value);
++	}
++	return 0;
++}
++
++/**
++ * Show the data for a given node (and perhaps property) according to the
++ * display option provided.
++ *
++ * @param blob		FDT blob
++ * @param disp		Display information / options
++ * @param node		Node to display
++ * @param property	Name of property to display, or NULL if none
++ * @return 0 if ok, -ve on error
++ */
++static int show_data_for_item(const void *blob, struct display_info *disp,
++		int node, const char *property)
++{
++	const void *value = NULL;
++	int len, err = 0;
++
++	value = fdt_getprop(blob, node, property, &len);
++	if (value) {
++		if (show_data(disp, value, len))
++			err = -1;
++		else
++			printf("\n");
++	} else {
++		report_error(property, len);
++		err = -1;
++	}
++	return err;
++}
++
++/**
++ * Run the main fdtget operation, given a filename and valid arguments
++ *
++ * @param disp		Display information / options
++ * @param filename	Filename of blob file
++ * @param arg		List of arguments to process
++ * @param arg_count	Number of arguments
++ * @param return 0 if ok, -ve on error
++ */
++static int do_fdtget(struct display_info *disp, const char *filename,
++		     char **arg, int arg_count)
++{
++	char *blob;
++	int i, node;
++
++	blob = utilfdt_read(filename);
++	if (!blob)
++		return -1;
++
++	for (i = 0; i + 2 <= arg_count; i += 2) {
++		node = fdt_path_offset(blob, arg[0]);
++		if (node < 0) {
++			report_error(arg[0], node);
++			return -1;
++		}
++
++		if (show_data_for_item(blob, disp, node, arg[1]))
++			return -1;
++	}
++	return 0;
++}
++
++static const char *usage_msg =
++	"fdtget - read values from device tree\n"
++	"\n"
++	"Each value is printed on a new line.\n\n"
++	"Usage:\n"
++	"	fdtget <options> <dt file> [<node> <property>]...\n"
++	"Options:\n"
++	"\t-t <type>\tType of data\n"
++	"\t-h\t\tPrint this help\n\n"
++	USAGE_TYPE_MSG;
++
++static void usage(const char *msg)
++{
++	if (msg)
++		fprintf(stderr, "Error: %s\n\n", msg);
++
++	fprintf(stderr, "%s", usage_msg);
++	exit(2);
++}
++
++int main(int argc, char *argv[])
++{
++	char *filename = NULL;
++	struct display_info disp;
++
++	/* set defaults */
++	memset(&disp, '\0', sizeof(disp));
++	disp.size = -1;
++	for (;;) {
++		int c = getopt(argc, argv, "ht:");
++		if (c == -1)
++			break;
++
++		switch (c) {
++		case 'h':
++		case '?':
++			usage(NULL);
++
++		case 't':
++			if (utilfdt_decode_type(optarg, &disp.type,
++					&disp.size))
++				usage("Invalid type string");
++			break;
++		}
++	}
++
++	if (optind < argc)
++		filename = argv[optind++];
++	if (!filename)
++		usage("Missing filename");
++
++	argv += optind;
++	argc -= optind;
++
++	/* Allow no arguments, and silently succeed */
++	if (!argc)
++		return 0;
++
++	/* Check for node, property arguments */
++	if (argc % 2)
++		usage("Must have an even number of arguments");
++
++	if (do_fdtget(&disp, filename, argv, argc))
++		return 1;
++	return 0;
++}
+diff --git a/tests/fdtget-runtest.sh b/tests/fdtget-runtest.sh
+new file mode 100755
+index 0000000..f38184f
+--- /dev/null
++++ b/tests/fdtget-runtest.sh
+@@ -0,0 +1,35 @@
++#! /bin/sh
++
++. ./tests.sh
++
++LOG="tmp.log.$$"
++EXPECT="tmp.expect.$$"
++
++rm -f $TMPFILE $LOG
++
++expect="$1"
++echo "$expect" >$EXPECT
++shift
++
++verbose_run_log "$LOG" $VALGRIND "$DTGET" "$@"
++ret="$?"
++
++if [ "$ret" -ne 0 -a "$expect" = "ERR" ]; then
++	PASS
++fi
++
++if [ "$ret" -gt 127 ]; then
++    signame=$(kill -l $[ret - 128])
++    FAIL "Killed by SIG$signame"
++fi
++
++diff $EXPECT $LOG
++ret="$?"
++
++rm -f $LOG $EXPECT
++
++if [ "$ret" -eq 0 ]; then
++	PASS
++else
++	FAIL
++fi
+diff --git a/tests/run_tests.sh b/tests/run_tests.sh
+index e42154b..e6184df 100755
+--- a/tests/run_tests.sh
++++ b/tests/run_tests.sh
+@@ -83,6 +83,13 @@ asm_to_so_test () {
+     run_wrap_test asm_to_so "$@"
+ }
+ 
++run_fdtget_test () {
++    # run_fdtget_test name expected_output dtb_file args...
++    echo -n "$1:	"
++    shift
++    base_run_test sh fdtget-runtest.sh "$@"
++}
++
+ tree1_tests () {
+     TREE=$1
+ 
+@@ -402,6 +409,37 @@ dtbs_equal_tests () {
+     cmp_tests test_tree1.dtb $WRONG_TREE1
+ }
+ 
++fdtget_tests () {
++    file=label01.dtb
++    $DTC -O dtb -o $file ${file%.dtb}.dts 2>/dev/null
++
++    # run_fdtget_test <test-name> <expected-result> <args>...
++    run_fdtget_test "Simple string" "MyBoardName" $file / model
++    run_fdtget_test "Multiple string i" "77 121 66 111 \
++97 114 100 78 97 109 101 0 77 121 66 111 97 114 100 70 97 109 105 \
++108 121 78 97 109 101 0" $file / compatible
++    run_fdtget_test "Multiple string s" "MyBoardName MyBoardFamilyName" \
++	-t s $file / compatible
++    run_fdtget_test "Integer" "32768" $file /cpus/PowerPC,970@1 d-cache-size
++    run_fdtget_test "Integer hex" "8000" -tx $file \
++	/cpus/PowerPC,970@1 d-cache-size
++    run_fdtget_test "Integer list" "61 62 63 0" -tbx $file \
++	/randomnode tricky1
++    run_fdtget_test "Byte list short" "a b c d de ea ad be ef" -tbx \
++	$file /randomnode blob
++
++    # Here the property size is not a multiple of 4 bytes, so it should fail
++    run_fdtget_test "Integer list invalid" ERR -tlx \
++	$file /randomnode mixed
++    run_fdtget_test "Integer list halfword" "6162 6300 1234 0 a 0 b 0 c" -thx \
++	$file /randomnode mixed
++    run_fdtget_test "Integer list byte" \
++	"61 62 63 0 12 34 0 0 0 a 0 0 0 b 0 0 0 c" -thhx \
++	$file /randomnode mixed
++    run_fdtget_test "Missing property" ERR -ts \
++	$file /randomnode doctor-who
++}
++
+ utilfdt_tests () {
+     run_test utilfdt_test
+ }
+@@ -421,7 +459,7 @@ while getopts "vt:m" ARG ; do
+ done
+ 
+ if [ -z "$TESTSETS" ]; then
+-    TESTSETS="libfdt utilfdt dtc dtbs_equal"
++    TESTSETS="libfdt utilfdt dtc dtbs_equal fdtget"
+ fi
+ 
+ # Make sure we don't have stale blobs lying around
+@@ -441,6 +479,9 @@ for set in $TESTSETS; do
+ 	"dtbs_equal")
+ 	    dtbs_equal_tests
+ 	    ;;
++	"fdtget")
++	    fdtget_tests
++	    ;;
+     esac
+ done
+ 
+diff --git a/tests/tests.sh b/tests/tests.sh
+index 30ffead..d9a0524 100644
+--- a/tests/tests.sh
++++ b/tests/tests.sh
+@@ -11,6 +11,7 @@ FAIL () {
+ }
+ 
+ DTC=../dtc
++DTGET=../fdtget
+ 
+ verbose_run () {
+     if [ -z "$QUIET_TEST" ]; then
+diff --git a/util.h b/util.h
+index 730918e..c8eb45d 100644
+--- a/util.h
++++ b/util.h
+@@ -140,4 +140,14 @@ int utilfdt_write_err(const char *filename, const void *blob);
+  */
+ int utilfdt_decode_type(const char *fmt, int *type, int *size);
+ 
++/*
++ * This is a usage message fragment for the -t option. It is the format
++ * supported by utilfdt_decode_type.
++ */
++
++#define USAGE_TYPE_MSG \
++	"<type>\ts=string, i=int, u=unsigned, x=hex\n" \
++	"\tOptional modifier prefix:\n" \
++	"\t\thh or b=byte, h=2 byte, l=4 byte (default)\n";
++
+ #endif /* _UTIL_H */
+-- 
+1.7.8.3
+
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/21_Add-fdtput-utility-to-write-property-values-to-a-dev.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/21_Add-fdtput-utility-to-write-property-values-to-a-dev.patch
@@ -0,0 +1,534 @@
+From 1ede50c3559bbfca79fadcbfd8acb9388f4aac87 Mon Sep 17 00:00:00 2001
+From: Simon Glass <sjg@chromium.org>
+Date: Sat, 21 Jan 2012 10:14:48 -0800
+Subject: [PATCH 6/7] Add fdtput utility to write property values to a device
+ tree
+
+This simple utility allows writing of values into a device tree from the
+command line. It aimes to be the opposite of fdtget.
+
+What is it for:
+- Updating fdt values when a binary blob already exists
+   (even though source may be available it might be easier to use this
+    utility rather than sed, etc.)
+- Writing machine-specific fdt values within a build system
+
+To use it, specify the fdt binary file on command line followed by the node
+and property to set. Then, provide a list of values to put into that
+property. Often there will be just one, but fdtput also supports arrays and
+string lists.
+
+fdtput does not try to guess the type of the property based on looking at
+the arguments. Instead it always assumes that an integer is provided. To
+indicate that you want to write a string, use -ts. You can also provide
+hex values with -tx.
+
+The command line arguments are joined together into a single value. For
+strings, a nul terminator is placed between each string when it is packed
+into the property. To avoid this, pass the string as a single argument.
+
+Usage:
+	fdtput <options> <dt file> <<node> <property> [<value>...]
+Options:
+	-t <type>	Type of data
+	-v		Verbose: display each value decoded from command line
+	-h		Print this help
+
+<type>	s=string, i=int, u=unsigned, x=hex
+	Optional modifier prefix:
+		hh or b=byte, h=2 byte, l=4 byte (default)
+
+To read from stdin and write to stdout, use - as the file. So you can do:
+
+cat somefile.dtb | fdtput -ts - /node prop "My string value" > newfile.dtb
+
+This commit also adds basic tests to verify the major features.
+
+Signed-off-by: Simon Glass <sjg@chromium.org>
+---
+ .gitignore              |    1 +
+ Makefile                |    4 +
+ Makefile.utils          |    7 ++
+ fdtput.c                |  235 +++++++++++++++++++++++++++++++++++++++++++++++
+ tests/fdtput-runtest.sh |   55 +++++++++++
+ tests/run_tests.sh      |   73 ++++++++++++++-
+ tests/tests.sh          |    1 +
+ 7 files changed, 375 insertions(+), 1 deletions(-)
+ create mode 100644 fdtput.c
+ create mode 100644 tests/fdtput-runtest.sh
+
+diff --git a/.gitignore b/.gitignore
+index 2d82b71..5074980 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -11,3 +11,4 @@ lex.yy.c
+ /convert-dtsv0
+ /version_gen.h
+ /fdtget
++/fdtput
+diff --git a/Makefile b/Makefile
+index a54a209..510caa6 100644
+--- a/Makefile
++++ b/Makefile
+@@ -111,6 +111,7 @@ BIN += convert-dtsv0
+ BIN += dtc
+ BIN += fdtdump
+ BIN += fdtget
++BIN += fdtput
+ 
+ SCRIPTS = dtdiff
+ 
+@@ -122,6 +123,7 @@ ifneq ($(DEPTARGETS),)
+ -include $(CONVERT_OBJS:%.o=%.d)
+ -include $(FDTDUMP_OBJS:%.o=%.d)
+ -include $(FDTGET_OBJS:%.o=%.d)
++-include $(FDTPUT_OBJS:%.o=%.d)
+ endif
+ 
+ 
+@@ -184,6 +186,8 @@ fdtdump:	$(FDTDUMP_OBJS)
+ 
+ fdtget:	$(FDTGET_OBJS) $(LIBFDT_archive)
+ 
++fdtput:	$(FDTPUT_OBJS) $(LIBFDT_archive)
++
+ 
+ #
+ # Testsuite rules
+diff --git a/Makefile.utils b/Makefile.utils
+index 38efa3c..48ece49 100644
+--- a/Makefile.utils
++++ b/Makefile.utils
+@@ -15,3 +15,10 @@ FDTGET_SRCS = \
+ 	util.c
+ 
+ FDTGET_OBJS = $(FDTGET_SRCS:%.c=%.o)
++
++
++FDTPUT_SRCS = \
++	fdtput.c \
++	util.c
++
++FDTPUT_OBJS = $(FDTPUT_SRCS:%.c=%.o)
+diff --git a/fdtput.c b/fdtput.c
+new file mode 100644
+index 0000000..f6ebd24
+--- /dev/null
++++ b/fdtput.c
+@@ -0,0 +1,235 @@
++/*
++ * Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
++ *
++ * 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 <assert.h>
++#include <ctype.h>
++#include <getopt.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++#include <libfdt.h>
++
++#include "util.h"
++
++struct display_info {
++	int type;		/* data type (s/i/u/x or 0 for default) */
++	int size;		/* data size (1/2/4) */
++	int verbose;		/* verbose output */
++};
++
++static void report_error(const char *where, int err)
++{
++	fprintf(stderr, "Error at '%s': %s\n", where, fdt_strerror(err));
++}
++
++/**
++ * Encode a series of arguments in a property value.
++ *
++ * @param disp		Display information / options
++ * @param arg		List of arguments from command line
++ * @param arg_count	Number of arguments (may be 0)
++ * @param valuep	Returns buffer containing value
++ * @param *value_len	Returns length of value encoded
++ */
++static int encode_value(struct display_info *disp, char **arg, int arg_count,
++			char **valuep, int *value_len)
++{
++	char *value = NULL;	/* holding area for value */
++	int value_size = 0;	/* size of holding area */
++	char *ptr;		/* pointer to current value position */
++	int len;		/* length of this cell/string/byte */
++	int ival;
++	int upto;	/* the number of bytes we have written to buf */
++	char fmt[3];
++
++	upto = 0;
++
++	if (disp->verbose)
++		fprintf(stderr, "Decoding value:\n");
++
++	fmt[0] = '%';
++	fmt[1] = disp->type ? disp->type : 'd';
++	fmt[2] = '\0';
++	for (; arg_count > 0; arg++, arg_count--, upto += len) {
++		/* assume integer unless told otherwise */
++		if (disp->type == 's')
++			len = strlen(*arg) + 1;
++		else
++			len = disp->size == -1 ? 4 : disp->size;
++
++		/* enlarge our value buffer by a suitable margin if needed */
++		if (upto + len > value_size) {
++			value_size = (upto + len) + 500;
++			value = realloc(value, value_size);
++			if (!value) {
++				fprintf(stderr, "Out of mmory: cannot alloc "
++					"%d bytes\n", value_size);
++				return -1;
++			}
++		}
++
++		ptr = value + upto;
++		if (disp->type == 's') {
++			memcpy(ptr, *arg, len);
++			if (disp->verbose)
++				fprintf(stderr, "\tstring: '%s'\n", ptr);
++		} else {
++			int *iptr = (int *)ptr;
++			sscanf(*arg, fmt, &ival);
++			if (len == 4)
++				*iptr = cpu_to_fdt32(ival);
++			else
++				*ptr = (uint8_t)ival;
++			if (disp->verbose) {
++				fprintf(stderr, "\t%s: %d\n",
++					disp->size == 1 ? "byte" :
++					disp->size == 2 ? "short" : "int",
++					ival);
++			}
++		}
++	}
++	*value_len = upto;
++	*valuep = value;
++	if (disp->verbose)
++		fprintf(stderr, "Value size %d\n", upto);
++	return 0;
++}
++
++static int store_key_value(void *blob, const char *node_name,
++		const char *property, const char *buf, int len)
++{
++	int node;
++	int err;
++
++	node = fdt_path_offset(blob, node_name);
++	if (node < 0) {
++		report_error(node_name, node);
++		return -1;
++	}
++
++	err = fdt_setprop(blob, node, property, buf, len);
++	if (err) {
++		report_error(property, err);
++		return -1;
++	}
++	return 0;
++}
++
++static int do_fdtput(struct display_info *disp, const char *filename,
++		    char **arg, int arg_count)
++{
++	char *value;
++	char *blob;
++	int len, ret = 0;
++
++	blob = utilfdt_read(filename);
++	if (!blob)
++		return -1;
++
++	/* convert the arguments into a single binary value, then store */
++	assert(arg_count >= 2);
++	if (encode_value(disp, arg + 2, arg_count - 2, &value, &len) ||
++		store_key_value(blob, *arg, arg[1], value, len))
++		ret = -1;
++
++	if (!ret)
++		ret = utilfdt_write(filename, blob);
++
++	free(blob);
++	return ret;
++}
++
++static const char *usage_msg =
++	"fdtput - write a property value to a device tree\n"
++	"\n"
++	"The command line arguments are joined together into a single value.\n"
++	"\n"
++	"Usage:\n"
++	"	fdtput <options> <dt file> <<node> <property> [<value>...]\n"
++	"Options:\n"
++	"\t-t <type>\tType of data\n"
++	"\t-v\t\tVerbose: display each value decoded from command line\n"
++	"\t-h\t\tPrint this help\n\n"
++	USAGE_TYPE_MSG;
++
++static void usage(const char *msg)
++{
++	if (msg)
++		fprintf(stderr, "Error: %s\n\n", msg);
++
++	fprintf(stderr, "%s", usage_msg);
++	exit(2);
++}
++
++int main(int argc, char *argv[])
++{
++	struct display_info disp;
++	char *filename = NULL;
++
++	memset(&disp, '\0', sizeof(disp));
++	disp.size = -1;
++	for (;;) {
++		int c = getopt(argc, argv, "ht:v");
++		if (c == -1)
++			break;
++
++		/*
++		 * TODO: add options to:
++		 * - delete property
++		 * - delete node (optionally recursively)
++		 * - rename node
++		 * - pack fdt before writing
++		 * - set amount of free space when writing
++		 * - expand fdt if value doesn't fit
++		 */
++		switch (c) {
++		case 'h':
++		case '?':
++			usage(NULL);
++
++		case 't':
++			if (utilfdt_decode_type(optarg, &disp.type,
++					&disp.size))
++				usage("Invalid type string");
++			break;
++
++		case 'v':
++			disp.verbose = 1;
++			break;
++		}
++	}
++
++	if (optind < argc)
++		filename = argv[optind++];
++	if (!filename)
++		usage("Missing filename");
++
++	argv += optind;
++	argc -= optind;
++
++	if (argc < 1)
++		usage("Missing node");
++	if (argc < 2)
++		usage("Missing property");
++
++	if (do_fdtput(&disp, filename, argv, argc))
++		return 1;
++	return 0;
++}
+diff --git a/tests/fdtput-runtest.sh b/tests/fdtput-runtest.sh
+new file mode 100644
+index 0000000..ea51569
+--- /dev/null
++++ b/tests/fdtput-runtest.sh
+@@ -0,0 +1,55 @@
++#! /bin/sh
++
++# Run script for fdtput tests
++# We run fdtput to update the device tree, thn fdtget to check it
++
++# Usage
++#    fdtput-runtest.sh name expected_output dtb_file node property flags value
++
++. ./tests.sh
++
++LOG="tmp.log.$$"
++EXPECT="tmp.expect.$$"
++
++rm -f $TMPFILE $LOG
++
++expect="$1"
++echo "$expect" >$EXPECT
++dtb="$2"
++node="$3"
++property="$4"
++flags="$5"
++shift 5
++value="$@"
++
++# First run fdtput
++verbose_run $VALGRIND "$DTPUT" "$dtb" "$node" "$property" $value $flags
++ret="$?"
++
++if [ "$ret" -ne 0 -a "$expect" = "ERR" ]; then
++	PASS
++fi
++if [ "$ret" -gt 127 ]; then
++    signame=$(kill -l $[ret - 128])
++    FAIL "Killed by SIG$signame"
++fi
++
++# Now fdtget to read the value
++verbose_run_log "$LOG" $VALGRIND "$DTGET" "$dtb" "$node" "$property" $flags
++ret="$?"
++
++if [ "$ret" -gt 127 ]; then
++    signame=$(kill -l $[ret - 128])
++    FAIL "Killed by SIG$signame"
++fi
++
++diff $EXPECT $LOG
++ret="$?"
++
++rm -f $LOG $EXPECT
++
++if [ "$ret" -eq 0 ]; then
++	PASS
++else
++	FAIL
++fi
+diff --git a/tests/run_tests.sh b/tests/run_tests.sh
+index e6184df..2650559 100755
+--- a/tests/run_tests.sh
++++ b/tests/run_tests.sh
+@@ -90,6 +90,21 @@ run_fdtget_test () {
+     base_run_test sh fdtget-runtest.sh "$@"
+ }
+ 
++run_fdtput_test () {
++    # run_fdtput_test name expected_output dtb_file node property flags value...
++    echo -n "$1:	"
++    shift
++    output="$1"
++    dtb="$2"
++    node="$3"
++    property="$4"
++    flags="$5"
++    shift 5
++    base_run_test sh fdtput-runtest.sh "$output" "$dtb" "$node" "$property" \
++		"$flags" $@
++#     base_run_test sh fdtput-runtest.sh "$@"
++}
++
+ tree1_tests () {
+     TREE=$1
+ 
+@@ -440,6 +455,59 @@ fdtget_tests () {
+ 	$file /randomnode doctor-who
+ }
+ 
++fdtput_tests () {
++    file=label01.dtb
++    src=label01.dts
++
++    # Create some test files containing useful strings
++    base=tmp.test0
++    file1=tmp.test1
++    file2=tmp.test2
++    bigfile1=tmp.test3
++    bigfile2=tmp.test4
++
++    # Filter out anything the shell might not like
++    cat $src | tr -d "'\"\n\;/\.\*{}\-" | tr -s "[:blank:]" " " >$base
++
++    # Make two small files
++    head -5 $base >$file1
++    cat $file1 | tr a-z A-Z | cut -c10-30 | sort -r >$file2
++
++    # and two larger ones
++    cat $base > $bigfile1
++    tac $base | tr a-z A-Z | sort -r >$bigfile2
++
++    # Allow just enough space for both file1 and file2
++    (( space = $(stat -c %s $file1) + $(stat -c %s $file2) ))
++    $DTC -O dtb -p $space -o $file ${file%.dtb}.dts 2>/dev/null
++
++    # run_fdtput_test <test-name> <expected-result> <file> <key> <flags>
++    #		<args>...
++    run_fdtput_test "Simple string" "a_model" $file / model -ts "a_model"
++    run_fdtput_test "Multiple string s" "board1 board2" \
++	$file / compatible -ts board1 board2
++    run_fdtput_test "Single string with spaces" "board1 board2" \
++	$file / compatible -ts "board1 board2"
++    run_fdtput_test "Integer" "32768" \
++	$file /cpus/PowerPC,970@1 d-cache-size "" "32768"
++    run_fdtput_test "Integer hex" "8001" \
++	$file /cpus/PowerPC,970@1 d-cache-size -tx 0x8001
++    run_fdtput_test "Integer list" "2 3 12" \
++	$file /randomnode tricky1 -tbi "02 003 12"
++    run_fdtput_test "Byte list short" "a b c ea ad be ef" \
++	$file /randomnode blob -tbx "a b c ea ad be ef"
++    run_fdtput_test "Integer list short" "a0b0c0d deeaae ef000000" \
++	$file /randomnode blob -tx "a0b0c0d deeaae ef000000"
++    run_fdtput_test "Large string list" "`cat $file1 $file2`" \
++	$file /randomnode blob -ts "`cat $file1`" "`cat $file2`"
++
++    # This should be larger than available space in the fdt ($space)
++    run_fdtput_test "Enormous string list" ERR \
++	$file /randomnode blob -ts "`cat $bigfile1`" "`cat $bigfile2`"
++
++    # TODO: Add tests for verbose mode?
++}
++
+ utilfdt_tests () {
+     run_test utilfdt_test
+ }
+@@ -459,7 +527,7 @@ while getopts "vt:m" ARG ; do
+ done
+ 
+ if [ -z "$TESTSETS" ]; then
+-    TESTSETS="libfdt utilfdt dtc dtbs_equal fdtget"
++    TESTSETS="libfdt utilfdt dtc dtbs_equal fdtget fdtput"
+ fi
+ 
+ # Make sure we don't have stale blobs lying around
+@@ -482,6 +550,9 @@ for set in $TESTSETS; do
+ 	"fdtget")
+ 	    fdtget_tests
+ 	    ;;
++	"fdtput")
++	    fdtput_tests
++	    ;;
+     esac
+ done
+ 
+diff --git a/tests/tests.sh b/tests/tests.sh
+index d9a0524..6e5e76a 100644
+--- a/tests/tests.sh
++++ b/tests/tests.sh
+@@ -12,6 +12,7 @@ FAIL () {
+ 
+ DTC=../dtc
+ DTGET=../fdtget
++DTPUT=../fdtput
+ 
+ verbose_run () {
+     if [ -z "$QUIET_TEST" ]; then
+-- 
+1.7.8.3
+
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/22_Introduce-TESTS_BIN-in-Makefiles-to-identify-tested-.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/22_Introduce-TESTS_BIN-in-Makefiles-to-identify-tested-.patch
@@ -0,0 +1,52 @@
+From 1456da7e2d3054882b20c120d817096bea21571e Mon Sep 17 00:00:00 2001
+From: Jon Loeliger <jdl@jdl.com>
+Date: Sat, 21 Jan 2012 15:24:51 -0600
+Subject: [PATCH 7/7] Introduce ${TESTS_BIN} in Makefiles to identify tested
+ executables.
+
+---
+ Makefile             |    6 ++++++
+ tests/Makefile.tests |    6 +++---
+ 2 files changed, 9 insertions(+), 3 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index 510caa6..1169e6c 100644
+--- a/Makefile
++++ b/Makefile
+@@ -193,6 +193,12 @@ fdtput:	$(FDTPUT_OBJS) $(LIBFDT_archive)
+ # Testsuite rules
+ #
+ TESTS_PREFIX=tests/
++
++TESTS_BIN += dtc
++TESTS_BIN += convert-dtsv0
++TESTS_BIN += fdtput
++TESTS_BIN += fdtget
++
+ include tests/Makefile.tests
+ 
+ #
+diff --git a/tests/Makefile.tests b/tests/Makefile.tests
+index 3f92074..2eee708 100644
+--- a/tests/Makefile.tests
++++ b/tests/Makefile.tests
+@@ -65,13 +65,13 @@ tests_clean:
+ 	rm -f $(STD_CLEANFILES:%=$(TESTS_PREFIX)%)
+ 	rm -f $(TESTS_CLEANFILES)
+ 
+-check:	tests dtc convert-dtsv0
++check:	tests ${TESTS_BIN}
+ 	cd $(TESTS_PREFIX); ./run_tests.sh
+ 
+-checkm: tests dtc convert-dtsv0
++checkm: tests ${TESTS_BIN}
+ 	cd $(TESTS_PREFIX); ./run_tests.sh -m 2>&1 | tee vglog.$$$$
+ 
+-checkv:	tests dtc convert-dtsv0
++checkv:	tests ${TESTS_BIN}
+ 	cd $(TESTS_PREFIX); ./run_tests.sh -v
+ 
+ ifneq ($(DEPTARGETS),)
+-- 
+1.7.8.3
+
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/local-add-missing-header-706137.patch
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/local-add-missing-header-706137.patch
@@ -0,0 +1,19 @@
+Description: libfdt-dev: Missing header file prevents the library usage
+ device-tree-compiler (1.3.0-3) unstable; urgency=low
+ .
+   * libfdt-dev: Missing header file prevents the library usage
+     Thanks Domenico Andreoli (Closes: #706137)
+Author: Hector Oron <zumbi@debian.org>
+Bug-Debian: http://bugs.debian.org/706137
+
+--- device-tree-compiler-1.3.0.orig/libfdt/Makefile.libfdt
++++ device-tree-compiler-1.3.0/libfdt/Makefile.libfdt
+@@ -4,7 +4,7 @@
+ # be easily embeddable into other systems of Makefiles.
+ #
+ LIBFDT_soname = libfdt.$(SHAREDLIB_EXT).1
+-LIBFDT_INCLUDES = fdt.h libfdt.h
++LIBFDT_INCLUDES = fdt.h libfdt.h libfdt_env.h
+ LIBFDT_VERSION = version.lds
+ LIBFDT_SRCS = fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
+ LIBFDT_OBJS = $(LIBFDT_SRCS:%.c=%.o)
--- device-tree-compiler-1.4.0+dfsg.orig/debian/patches/series
+++ device-tree-compiler-1.4.0+dfsg/debian/patches/series
@@ -0,0 +1,23 @@
+01_build_doc.patch
+#02_remove-unused-check-variable.patch
+#03_Remove-unused-variable-in-flat_read_mem_reserve.patch
+#04_Split-out-is_printable_string-into-util.patch
+#05_Add-missing-tests-to-gitignore.patch
+#06_Refactor-character-literal-parsing-code.patch
+#07_Remove-gcc-4.6-set-but-not-used-warnings.patch
+#08_Support-character-literals-in-cell-lists.patch
+#09_Create-Makefile_utils-and-move-ftdump-into-it.patch
+#10_Add-fdt-read_write-utility-functions.patch
+#11_Make-testutils-use-utilfdt.patch
+#12_use-utilfdt-to-read-blob.patch
+#13_Add-fdt16_to_cpu-utility-function.patch
+#14_Add-data_append_integer-function.patch
+#15_Add-support-for-variable-sized-elements.patch
+#16_fdtdump-rename-from-ftdump.patch
+#17_libfdt-Add-support-for-appending-the-values-to-a-exi.patch
+#18_libfdt-Activate-testcase-for-appending-properties.patch
+#19_dtc-Implement-d-option-to-write-out-a-dependency-fil.patch
+#20_Add-fdtget-utility-to-read-property-values-from-a-de.patch
+#21_Add-fdtput-utility-to-write-property-values-to-a-dev.patch
+#22_Introduce-TESTS_BIN-in-Makefiles-to-identify-tested-.patch
+#local-add-missing-header-706137.patch
--- device-tree-compiler-1.4.0+dfsg.orig/debian/rules
+++ device-tree-compiler-1.4.0+dfsg/debian/rules
@@ -0,0 +1,73 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+export CFLAGS = -Wall -g -fPIC
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+	CFLAGS += -O0
+else
+	CFLAGS += -O2
+endif
+
+build: build-arch build-indep
+build-arch: build-stamp
+build-indep: build-stamp
+build-stamp:
+	dh_testdir
+	QUILT_PATCHES=debian/patches quilt push -a || test $$? = 2
+	$(MAKE) CFLAGS="$(CFLAGS)"
+	$(MAKE) -C Documentation
+	touch build-stamp
+
+clean: clean1
+clean1:
+	dh_testdir
+	dh_testroot
+	rm -f build-stamp install-stamp
+	$(MAKE) clean
+	[ ! -f Documentation/Makefile ] || $(MAKE) -C Documentation clean
+	QUILT_PATCHES=debian/patches quilt pop -a -R || test $$? = 2
+	rm -rf .pc
+	dh_clean
+
+install: build
+	dh_testdir
+	dh_testroot
+	dh_prep
+	dh_installdirs
+	$(MAKE) install DESTDIR=$(CURDIR)/debian/tmp PREFIX=/usr LIBDIR=/usr/lib/$(DEB_HOST_MULTIARCH)
+	dh_install --list-missing --sourcedir=debian/tmp
+	touch install-stamp
+
+# Build architecture-independent files here.
+binary-indep: build install
+
+# Build architecture-dependent files here.
+binary-arch: build install
+	dh_testdir
+	dh_testroot
+	dh_installchangelogs
+	dh_installdocs Documentation/dtc-paper.dvi Documentation/dtc-paper.ps \
+		Documentation/dtc-paper.pdf Documentation/dtc-manual.txt
+	dh_installexamples
+	dh_installman debian/manpages/*
+	dh_link
+	dh_strip
+	dh_compress
+	dh_fixperms
+	dh_makeshlibs
+	dh_installdeb
+	dh_shlibdeps
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install
--- device-tree-compiler-1.4.0+dfsg.orig/debian/source/format
+++ device-tree-compiler-1.4.0+dfsg/debian/source/format
@@ -0,0 +1 @@
+1.0