core: Add functions to set properties in live-tree
Implement a set of functions to manipulate properties in a live device tree: * ofnode_write_prop() to set generic properties of a node * ofnode_write_string() to set string properties of a node * ofnode_set_enabled() to either enable or disable a node Signed-off-by: Mario Six <mario.six@gdsys.cc> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
		
							parent
							
								
									163ed6c342
								
							
						
					
					
						commit
						e369e58df7
					
				|  | @ -791,3 +791,73 @@ ofnode ofnode_by_prop_value(ofnode from, const char *propname, | ||||||
| 				propname, propval, proplen)); | 				propname, propval, proplen)); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | int ofnode_write_prop(ofnode node, const char *propname, int len, | ||||||
|  | 		      const void *value) | ||||||
|  | { | ||||||
|  | 	const struct device_node *np = ofnode_to_np(node); | ||||||
|  | 	struct property *pp; | ||||||
|  | 	struct property *pp_last = NULL; | ||||||
|  | 	struct property *new; | ||||||
|  | 
 | ||||||
|  | 	if (!of_live_active()) | ||||||
|  | 		return -ENOSYS; | ||||||
|  | 
 | ||||||
|  | 	if (!np) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	for (pp = np->properties; pp; pp = pp->next) { | ||||||
|  | 		if (strcmp(pp->name, propname) == 0) { | ||||||
|  | 			/* Property exists -> change value */ | ||||||
|  | 			pp->value = (void *)value; | ||||||
|  | 			pp->length = len; | ||||||
|  | 			return 0; | ||||||
|  | 		} | ||||||
|  | 		pp_last = pp; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (!pp_last) | ||||||
|  | 		return -ENOENT; | ||||||
|  | 
 | ||||||
|  | 	/* Property does not exist -> append new property */ | ||||||
|  | 	new = malloc(sizeof(struct property)); | ||||||
|  | 	if (!new) | ||||||
|  | 		return -ENOMEM; | ||||||
|  | 
 | ||||||
|  | 	new->name = strdup(propname); | ||||||
|  | 	if (!new->name) | ||||||
|  | 		return -ENOMEM; | ||||||
|  | 
 | ||||||
|  | 	new->value = (void *)value; | ||||||
|  | 	new->length = len; | ||||||
|  | 	new->next = NULL; | ||||||
|  | 
 | ||||||
|  | 	pp_last->next = new; | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int ofnode_write_string(ofnode node, const char *propname, const char *value) | ||||||
|  | { | ||||||
|  | 	if (!of_live_active()) | ||||||
|  | 		return -ENOSYS; | ||||||
|  | 
 | ||||||
|  | 	assert(ofnode_valid(node)); | ||||||
|  | 
 | ||||||
|  | 	debug("%s: %s = %s", __func__, propname, value); | ||||||
|  | 
 | ||||||
|  | 	return ofnode_write_prop(node, propname, strlen(value) + 1, value); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int ofnode_set_enabled(ofnode node, bool value) | ||||||
|  | { | ||||||
|  | 	if (!of_live_active()) | ||||||
|  | 		return -ENOSYS; | ||||||
|  | 
 | ||||||
|  | 	assert(ofnode_valid(node)); | ||||||
|  | 
 | ||||||
|  | 	if (value) | ||||||
|  | 		return ofnode_write_string(node, "status", "okay"); | ||||||
|  | 	else | ||||||
|  | 		return ofnode_write_string(node, "status", "disable"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -764,4 +764,50 @@ u64 ofnode_translate_address(ofnode node, const fdt32_t *in_addr); | ||||||
|  * @return true if OK, false if the compatible is not found |  * @return true if OK, false if the compatible is not found | ||||||
|  */ |  */ | ||||||
| int ofnode_device_is_compatible(ofnode node, const char *compat); | int ofnode_device_is_compatible(ofnode node, const char *compat); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * ofnode_write_prop() - Set a property of a ofnode | ||||||
|  |  * | ||||||
|  |  * Note that the value passed to the function is *not* allocated by the | ||||||
|  |  * function itself, but must be allocated by the caller if necessary. | ||||||
|  |  * | ||||||
|  |  * @node:	The node for whose property should be set | ||||||
|  |  * @propname:	The name of the property to set | ||||||
|  |  * @len:	The length of the new value of the property | ||||||
|  |  * @value:	The new value of the property (must be valid prior to calling | ||||||
|  |  *		the function) | ||||||
|  |  * @return 0 if successful, -ve on error | ||||||
|  |  */ | ||||||
|  | int ofnode_write_prop(ofnode node, const char *propname, int len, | ||||||
|  | 		      const void *value); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * ofnode_write_string() - Set a string property of a ofnode | ||||||
|  |  * | ||||||
|  |  * Note that the value passed to the function is *not* allocated by the | ||||||
|  |  * function itself, but must be allocated by the caller if necessary. | ||||||
|  |  * | ||||||
|  |  * @node:	The node for whose string property should be set | ||||||
|  |  * @propname:	The name of the string property to set | ||||||
|  |  * @value:	The new value of the string property (must be valid prior to | ||||||
|  |  *		calling the function) | ||||||
|  |  * @return 0 if successful, -ve on error | ||||||
|  |  */ | ||||||
|  | int ofnode_write_string(ofnode node, const char *propname, const char *value); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * ofnode_set_enabled() - Enable or disable a device tree node given by its | ||||||
|  |  *			  ofnode | ||||||
|  |  * | ||||||
|  |  * This function effectively sets the node's "status" property to either "okay" | ||||||
|  |  * or "disable", hence making it available for driver model initialization or | ||||||
|  |  * not. | ||||||
|  |  * | ||||||
|  |  * @node:	The node to enable | ||||||
|  |  * @value:	Flag that tells the function to either disable or enable the | ||||||
|  |  *		node | ||||||
|  |  * @return 0 if successful, -ve on error | ||||||
|  |  */ | ||||||
|  | int ofnode_set_enabled(ofnode node, bool value); | ||||||
|  | 
 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue