static int update_dt_property(struct device_node *dn, struct property **prop, const char *name, u32 vd, char *value) { struct property *new_prop = *prop; int more = 0; /* A negative 'vd' value indicates that only part of the new property * value is contained in the buffer and we need to call * ibm,update-properties again to get the rest of the value. * * A negative value is also the two's compliment of the actual value. */ if (vd & 0x80000000) { vd = ~vd + 1; more = 1; } if (new_prop) { /* partial property fixup */ char *new_data = kzalloc(new_prop->length + vd, GFP_KERNEL); if (!new_data) return -ENOMEM; memcpy(new_data, new_prop->value, new_prop->length); memcpy(new_data + new_prop->length, value, vd); kfree(new_prop->value); new_prop->value = new_data; new_prop->length += vd; } else { new_prop = kzalloc(sizeof(*new_prop), GFP_KERNEL); if (!new_prop) return -ENOMEM; new_prop->name = kstrdup(name, GFP_KERNEL); if (!new_prop->name) { kfree(new_prop); return -ENOMEM; } new_prop->length = vd; new_prop->value = kzalloc(new_prop->length, GFP_KERNEL); if (!new_prop->value) { kfree(new_prop->name); kfree(new_prop); return -ENOMEM; } memcpy(new_prop->value, value, vd); *prop = new_prop; } if (!more) { prom_update_property(dn, new_prop); new_prop = NULL; } return 0; }
static int update_dt_property(struct device_node *dn, struct property **prop, const char *name, u32 vd, char *value) { struct property *new_prop = *prop; struct property *old_prop; int more = 0; /* */ if (vd & 0x80000000) { vd = ~vd + 1; more = 1; } if (new_prop) { /* */ char *new_data = kzalloc(new_prop->length + vd, GFP_KERNEL); if (!new_data) return -ENOMEM; memcpy(new_data, new_prop->value, new_prop->length); memcpy(new_data + new_prop->length, value, vd); kfree(new_prop->value); new_prop->value = new_data; new_prop->length += vd; } else { new_prop = kzalloc(sizeof(*new_prop), GFP_KERNEL); if (!new_prop) return -ENOMEM; new_prop->name = kstrdup(name, GFP_KERNEL); if (!new_prop->name) { kfree(new_prop); return -ENOMEM; } new_prop->length = vd; new_prop->value = kzalloc(new_prop->length, GFP_KERNEL); if (!new_prop->value) { kfree(new_prop->name); kfree(new_prop); return -ENOMEM; } memcpy(new_prop->value, value, vd); *prop = new_prop; } if (!more) { old_prop = of_find_property(dn, new_prop->name, NULL); if (old_prop) prom_update_property(dn, new_prop, old_prop); else prom_add_property(dn, new_prop); new_prop = NULL; } return 0; }