diff options
author | David S. Miller <davem@davemloft.net> | 2008-12-05 04:00:46 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-12-05 20:04:22 -0500 |
commit | b9e5567cda6387e0f4061bfceebbc1bd63ee42a6 (patch) | |
tree | 0c7cc9f46f65b943fe8065ba2b3af31a3bbf06b1 /arch/sparc/kernel/prom_common.c | |
parent | e5ff0fe31d69e716f2599bcfb297ca3757e957c5 (diff) |
sparc: Move property building code into prom_common.c
Unfortunately there is some sparc32/sparc64 ifdef'ery in
here due to the difference in how the prom_firstprop()
and prom_nextprop() routines work.
This will be eliminated eventually.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc/kernel/prom_common.c')
-rw-r--r-- | arch/sparc/kernel/prom_common.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/arch/sparc/kernel/prom_common.c b/arch/sparc/kernel/prom_common.c index a23180801014..762056762b72 100644 --- a/arch/sparc/kernel/prom_common.c +++ b/arch/sparc/kernel/prom_common.c | |||
@@ -120,3 +120,84 @@ int of_find_in_proplist(const char *list, const char *match, int len) | |||
120 | EXPORT_SYMBOL(of_find_in_proplist); | 120 | EXPORT_SYMBOL(of_find_in_proplist); |
121 | 121 | ||
122 | unsigned int prom_unique_id; | 122 | unsigned int prom_unique_id; |
123 | |||
124 | static struct property * __init build_one_prop(phandle node, char *prev, | ||
125 | char *special_name, | ||
126 | void *special_val, | ||
127 | int special_len) | ||
128 | { | ||
129 | static struct property *tmp = NULL; | ||
130 | struct property *p; | ||
131 | const char *name; | ||
132 | |||
133 | if (tmp) { | ||
134 | p = tmp; | ||
135 | memset(p, 0, sizeof(*p) + 32); | ||
136 | tmp = NULL; | ||
137 | } else { | ||
138 | p = prom_early_alloc(sizeof(struct property) + 32); | ||
139 | p->unique_id = prom_unique_id++; | ||
140 | } | ||
141 | |||
142 | p->name = (char *) (p + 1); | ||
143 | if (special_name) { | ||
144 | strcpy(p->name, special_name); | ||
145 | p->length = special_len; | ||
146 | p->value = prom_early_alloc(special_len); | ||
147 | memcpy(p->value, special_val, special_len); | ||
148 | } else { | ||
149 | #ifdef CONFIG_SPARC32 | ||
150 | if (prev == NULL) { | ||
151 | name = prom_firstprop(node, NULL); | ||
152 | } else { | ||
153 | name = prom_nextprop(node, prev, NULL); | ||
154 | } | ||
155 | #else | ||
156 | if (prev == NULL) { | ||
157 | prom_firstprop(node, p->name); | ||
158 | } else { | ||
159 | prom_nextprop(node, prev, p->name); | ||
160 | } | ||
161 | name = p->name; | ||
162 | #endif | ||
163 | if (strlen(name) == 0) { | ||
164 | tmp = p; | ||
165 | return NULL; | ||
166 | } | ||
167 | #ifdef CONFIG_SPARC32 | ||
168 | strcpy(p->name, name); | ||
169 | #endif | ||
170 | p->length = prom_getproplen(node, p->name); | ||
171 | if (p->length <= 0) { | ||
172 | p->length = 0; | ||
173 | } else { | ||
174 | int len; | ||
175 | |||
176 | p->value = prom_early_alloc(p->length + 1); | ||
177 | len = prom_getproperty(node, p->name, p->value, | ||
178 | p->length); | ||
179 | if (len <= 0) | ||
180 | p->length = 0; | ||
181 | ((unsigned char *)p->value)[p->length] = '\0'; | ||
182 | } | ||
183 | } | ||
184 | return p; | ||
185 | } | ||
186 | |||
187 | struct property * __init build_prop_list(phandle node) | ||
188 | { | ||
189 | struct property *head, *tail; | ||
190 | |||
191 | head = tail = build_one_prop(node, NULL, | ||
192 | ".node", &node, sizeof(node)); | ||
193 | |||
194 | tail->next = build_one_prop(node, NULL, NULL, NULL, 0); | ||
195 | tail = tail->next; | ||
196 | while(tail) { | ||
197 | tail->next = build_one_prop(node, tail->name, | ||
198 | NULL, NULL, 0); | ||
199 | tail = tail->next; | ||
200 | } | ||
201 | |||
202 | return head; | ||
203 | } | ||