np = unflatten_dt_alloc(&mem, sizeof(struct device_node) + l, 
/* version 0x10 has a more compact unit name here instead of the full * path. we accumulate the full path size using "fpsize", we'll rebuild * it later. We detect this because the first character of the name is * not '/'. */ if ((*pathp) != '/') { new_format = 1; if (fpsize == 0) { /* root node: special case. fpsize accounts for path * plus terminating zero. root node only has '/', so * fpsize should be 2, but we want to avoid the first * level nodes to have two '/' so we use fpsize 1 here */ fpsize = 1; allocl = 2; } else { /* account for '/' and path size minus terminal 0 * already in 'l' */ fpsize += l; allocl = fpsize; } }   np = unflatten_dt_alloc(&mem, sizeof(struct device_node) + allocl, 
static unsigned long __init unflatten_dt_node(unsigned long mem,					      unsigned long *p,					      struct device_node *dad,					      struct device_node ***allnextpp){	struct device_node *np;	struct property *pp, **prev_pp = NULL;	char *pathp;	u32 tag;	unsigned int l;	tag = *((u32 *)(*p));	if (tag != OF_DT_BEGIN_NODE) {		printk("Weird tag at start of node: %x\n", tag);		return mem;	}	*p += 4;	pathp = (char *)*p;	l = strlen(pathp) + 1;	*p = _ALIGN(*p + l, 4);	np = unflatten_dt_alloc(&mem, sizeof(struct device_node) + l,				__alignof__(struct device_node));	if (allnextpp) {		memset(np, 0, sizeof(*np));		np->full_name = ((char*)np) + sizeof(struct device_node);		memcpy(np->full_name, pathp, l);		prev_pp = &np->properties;		**allnextpp = np;		*allnextpp = &np->allnext;		if (dad != NULL) {			np->parent = dad;			/* we temporarily use the `next' field as `last_child'. */			if (dad->next == 0)				dad->child = np;			else				dad->next->sibling = np;			dad->next = np;		}		kref_init(&np->kref);	}	while(1) {		u32 sz, noff;		char *pname;		tag = *((u32 *)(*p));		if (tag != OF_DT_PROP)			break;		*p += 4;		sz = *((u32 *)(*p));		noff = *((u32 *)((*p) + 4));		*p = _ALIGN((*p) + 8, sz >= 8 ? 8 : 4);		pname = find_flat_dt_string(noff);		if (pname == NULL) {			printk("Can't find property name in list !\n");			break;		}		l = strlen(pname) + 1;		pp = unflatten_dt_alloc(&mem, sizeof(struct property),					__alignof__(struct property));		if (allnextpp) {			if (strcmp(pname, "linux,phandle") == 0) {				np->node = *((u32 *)*p);				if (np->linux_phandle == 0)					np->linux_phandle = np->node;			}			if (strcmp(pname, "ibm,phandle") == 0)				np->linux_phandle = *((u32 *)*p);			pp->name = pname;			pp->length = sz;			pp->value = (void *)*p;			*prev_pp = pp;			prev_pp = &pp->next;		}		*p = _ALIGN((*p) + sz, 4);	}	if (allnextpp) {		*prev_pp = NULL;		np->name = get_property(np, "name", NULL);		np->type = get_property(np, "device_type", NULL);		if (!np->name)			np->name = "<NULL>";		if (!np->type)			np->type = "<NULL>";	}	while (tag == OF_DT_BEGIN_NODE) {		mem = unflatten_dt_node(mem, p, np, allnextpp);		tag = *((u32 *)(*p));	}	if (tag != OF_DT_END_NODE) {		printk("Weird tag at start of node: %x\n", tag);		return mem;	}	*p += 4;	return mem;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/34153fa3af45d84f3221d9b67ba2ab7e8a220d28/prom.c/clean/arch/ppc64/kernel/prom.c