static struct property * __init build_one_prop(phandle node, char *prev, char *special_name, void *special_val, int special_len) { static struct property *tmp = NULL; struct property *p; const char *name; if (tmp) { p = tmp; memset(p, 0, sizeof(*p) + 32); tmp = NULL; } else { p = prom_early_alloc(sizeof(struct property) + 32); p->unique_id = prom_unique_id++; } p->name = (char *) (p + 1); if (special_name) { strcpy(p->name, special_name); p->length = special_len; p->value = prom_early_alloc(special_len); memcpy(p->value, special_val, special_len); } else { if (prev == NULL) { name = prom_firstprop(node, p->name); } else { name = prom_nextprop(node, prev, p->name); } if (!name || strlen(name) == 0) { tmp = p; return NULL; } #ifdef CONFIG_SPARC32 strcpy(p->name, name); #endif p->length = prom_getproplen(node, p->name); if (p->length <= 0) { p->length = 0; } else { int len; p->value = prom_early_alloc(p->length + 1); len = prom_getproperty(node, p->name, p->value, p->length); if (len <= 0) p->length = 0; ((unsigned char *)p->value)[p->length] = '\0'; } } return p; }
static struct property * __init of_pdt_build_one_prop(phandle node, char *prev, char *special_name, void *special_val, int special_len) { static struct property *tmp = NULL; struct property *p; int err; if (tmp) { p = tmp; memset(p, 0, sizeof(*p) + 32); tmp = NULL; } else { p = prom_early_alloc(sizeof(struct property) + 32); of_pdt_incr_unique_id(p); } p->name = (char *) (p + 1); if (special_name) { strcpy(p->name, special_name); p->length = special_len; p->value = prom_early_alloc(special_len); memcpy(p->value, special_val, special_len); } else { err = of_pdt_prom_ops->nextprop(node, prev, p->name); if (err) { tmp = p; return NULL; } p->length = of_pdt_prom_ops->getproplen(node, p->name); if (p->length <= 0) { p->length = 0; } else { int len; p->value = prom_early_alloc(p->length + 1); len = of_pdt_prom_ops->getproperty(node, p->name, p->value, p->length); if (len <= 0) p->length = 0; ((unsigned char *)p->value)[p->length] = '\0'; } } return p; }
static void __init psycho_irq_trans_init(struct device_node *dp) { const struct linux_prom64_registers *regs; dp->irq_trans = prom_early_alloc(sizeof(struct of_irq_controller)); dp->irq_trans->irq_build = psycho_irq_build; regs = of_get_property(dp, "reg", NULL); dp->irq_trans->data = (void *) regs[2].phys_addr; }
void __init leon_trans_init(struct device_node *dp) { if (strcmp(dp->type, "cpu") == 0 && strcmp(dp->name, "<NULL>") == 0) { struct property *p; p = of_find_property(dp, "mid", (void *)0); if (p) { int mid; dp->name = prom_early_alloc(5 + 1); memcpy(&mid, p->value, p->length); sprintf((char *)dp->name, "cpu%.2d", mid); } } }
static char * __init get_one_property(phandle node, const char *name) { char *buf = "<NULL>"; int len; len = prom_getproplen(node, name); if (len > 0) { buf = prom_early_alloc(len); len = prom_getproperty(node, name, buf, len); } return buf; }
static char * __init of_pdt_build_full_name(struct device_node *dp) { static int failsafe_id = 0; /* for generating unique names on failure */ char *buf; int len; if (of_pdt_prom_ops->pkg2path(dp->phandle, NULL, 0, &len)) goto failsafe; buf = prom_early_alloc(len + 1); if (of_pdt_prom_ops->pkg2path(dp->phandle, buf, len, &len)) goto failsafe; return buf; failsafe: buf = prom_early_alloc(strlen(dp->parent->full_name) + strlen(dp->name) + 16); sprintf(buf, "%s/%s@unknown%i", of_node_is_root(dp->parent) ? "" : dp->parent->full_name, dp->name, failsafe_id++); pr_err("%s: pkg2path failed; assigning %s\n", __func__, buf); return buf; }
char * __init build_full_name(struct device_node *dp) { int len, ourlen, plen; char *n; plen = strlen(dp->parent->full_name); ourlen = strlen(dp->path_component_name); len = ourlen + plen + 2; n = prom_early_alloc(len); strcpy(n, dp->parent->full_name); if (!of_node_is_root(dp->parent)) { strcpy(n + plen, "/"); plen++; } strcpy(n + plen, dp->path_component_name); return n; }
static char * __init of_pdt_try_pkg2path(phandle node) { char *res, *buf = NULL; int len; if (!of_pdt_prom_ops->pkg2path) return NULL; if (of_pdt_prom_ops->pkg2path(node, buf, 0, &len)) return NULL; buf = prom_early_alloc(len + 1); if (of_pdt_prom_ops->pkg2path(node, buf, len, &len)) { pr_err("%s: package-to-path failed\n", __func__); return NULL; } res = strrchr(buf, '/'); if (!res) { pr_err("%s: couldn't find / in %s\n", __func__, buf); return NULL; } return res+1; }
static struct device_node * __init of_pdt_create_node(phandle node, struct device_node *parent) { struct device_node *dp; if (!node) return NULL; dp = prom_early_alloc(sizeof(*dp)); of_node_init(dp); of_pdt_incr_unique_id(dp); dp->parent = parent; dp->name = of_pdt_get_one_property(node, "name"); dp->type = of_pdt_get_one_property(node, "device_type"); dp->phandle = node; dp->properties = of_pdt_build_prop_list(node); irq_trans_init(dp); return dp; }
static struct device_node * __init prom_create_node(phandle node, struct device_node *parent) { struct device_node *dp; if (!node) return NULL; dp = prom_early_alloc(sizeof(*dp)); dp->unique_id = prom_unique_id++; dp->parent = parent; kref_init(&dp->kref); dp->name = get_one_property(node, "name"); dp->type = get_one_property(node, "device_type"); dp->phandle = node; dp->properties = build_prop_list(node); irq_trans_init(dp); return dp; }
static void * __init kernel_tree_alloc(u64 size, u64 align) { return prom_early_alloc(size); }