~ubuntu-branches/ubuntu/maverick/u-boot-omap3/maverick

« back to all changes in this revision

Viewing changes to libfdt/fdt_wip.c

  • Committer: Bazaar Package Importer
  • Author(s): Oliver Grawert
  • Date: 2010-03-22 15:06:23 UTC
  • Revision ID: james.westby@ubuntu.com-20100322150623-i21g8rgiyl5dohag
Tags: upstream-2010.3git20100315
ImportĀ upstreamĀ versionĀ 2010.3git20100315

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * libfdt - Flat Device Tree manipulation
 
3
 * Copyright (C) 2006 David Gibson, IBM Corporation.
 
4
 *
 
5
 * libfdt is dual licensed: you can use it either under the terms of
 
6
 * the GPL, or the BSD license, at your option.
 
7
 *
 
8
 *  a) This library is free software; you can redistribute it and/or
 
9
 *     modify it under the terms of the GNU General Public License as
 
10
 *     published by the Free Software Foundation; either version 2 of the
 
11
 *     License, or (at your option) any later version.
 
12
 *
 
13
 *     This library is distributed in the hope that it will be useful,
 
14
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 
15
 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
16
 *     GNU General Public License for more details.
 
17
 *
 
18
 *     You should have received a copy of the GNU General Public
 
19
 *     License along with this library; if not, write to the Free
 
20
 *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
 
21
 *     MA 02110-1301 USA
 
22
 *
 
23
 * Alternatively,
 
24
 *
 
25
 *  b) Redistribution and use in source and binary forms, with or
 
26
 *     without modification, are permitted provided that the following
 
27
 *     conditions are met:
 
28
 *
 
29
 *     1. Redistributions of source code must retain the above
 
30
 *        copyright notice, this list of conditions and the following
 
31
 *        disclaimer.
 
32
 *     2. Redistributions in binary form must reproduce the above
 
33
 *        copyright notice, this list of conditions and the following
 
34
 *        disclaimer in the documentation and/or other materials
 
35
 *        provided with the distribution.
 
36
 *
 
37
 *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 
38
 *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 
39
 *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 
40
 *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 
41
 *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 
42
 *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 
43
 *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 
44
 *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 
45
 *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 
46
 *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 
47
 *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 
48
 *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 
49
 *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
50
 */
 
51
#include "libfdt_env.h"
 
52
 
 
53
#ifndef USE_HOSTCC
 
54
#include <fdt.h>
 
55
#include <libfdt.h>
 
56
#else
 
57
#include "fdt_host.h"
 
58
#endif
 
59
 
 
60
#include "libfdt_internal.h"
 
61
 
 
62
int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
 
63
                        const void *val, int len)
 
64
{
 
65
        void *propval;
 
66
        int proplen;
 
67
 
 
68
        propval = fdt_getprop_w(fdt, nodeoffset, name, &proplen);
 
69
        if (! propval)
 
70
                return proplen;
 
71
 
 
72
        if (proplen != len)
 
73
                return -FDT_ERR_NOSPACE;
 
74
 
 
75
        memcpy(propval, val, len);
 
76
        return 0;
 
77
}
 
78
 
 
79
static void _fdt_nop_region(void *start, int len)
 
80
{
 
81
        uint32_t *p;
 
82
 
 
83
        for (p = start; (char *)p < ((char *)start + len); p++)
 
84
                *p = cpu_to_fdt32(FDT_NOP);
 
85
}
 
86
 
 
87
int fdt_nop_property(void *fdt, int nodeoffset, const char *name)
 
88
{
 
89
        struct fdt_property *prop;
 
90
        int len;
 
91
 
 
92
        prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
 
93
        if (! prop)
 
94
                return len;
 
95
 
 
96
        _fdt_nop_region(prop, len + sizeof(*prop));
 
97
 
 
98
        return 0;
 
99
}
 
100
 
 
101
int _fdt_node_end_offset(void *fdt, int offset)
 
102
{
 
103
        int depth = 0;
 
104
 
 
105
        while ((offset >= 0) && (depth >= 0))
 
106
                offset = fdt_next_node(fdt, offset, &depth);
 
107
 
 
108
        return offset;
 
109
}
 
110
 
 
111
int fdt_nop_node(void *fdt, int nodeoffset)
 
112
{
 
113
        int endoffset;
 
114
 
 
115
        endoffset = _fdt_node_end_offset(fdt, nodeoffset);
 
116
        if (endoffset < 0)
 
117
                return endoffset;
 
118
 
 
119
        _fdt_nop_region(fdt_offset_ptr_w(fdt, nodeoffset, 0),
 
120
                        endoffset - nodeoffset);
 
121
        return 0;
 
122
}