diff options
Diffstat (limited to 'include/linux/of.h')
| -rw-r--r-- | include/linux/of.h | 137 | 
1 files changed, 123 insertions, 14 deletions
diff --git a/include/linux/of.h b/include/linux/of.h index 435cb995904d..919bf211877d 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -18,7 +18,7 @@  #include <linux/types.h>  #include <linux/bitops.h>  #include <linux/errno.h> -#include <linux/kref.h> +#include <linux/kobject.h>  #include <linux/mod_devicetable.h>  #include <linux/spinlock.h>  #include <linux/topology.h> @@ -37,6 +37,7 @@ struct property {  	struct property *next;  	unsigned long _flags;  	unsigned int unique_id; +	struct bin_attribute attr;  };  #if defined(CONFIG_SPARC) @@ -56,8 +57,7 @@ struct device_node {  	struct	device_node *sibling;  	struct	device_node *next;	/* next device of same type */  	struct	device_node *allnext;	/* next in list of all nodes */ -	struct	proc_dir_entry *pde;	/* this node's proc directory */ -	struct	kref kref; +	struct	kobject kobj;  	unsigned long _flags;  	void	*data;  #if defined(CONFIG_SPARC) @@ -67,13 +67,34 @@ struct device_node {  #endif  }; -#define MAX_PHANDLE_ARGS 8 +#define MAX_PHANDLE_ARGS 16  struct of_phandle_args {  	struct device_node *np;  	int args_count;  	uint32_t args[MAX_PHANDLE_ARGS];  }; +extern int of_node_add(struct device_node *node); + +/* initialize a node */ +extern struct kobj_type of_node_ktype; +static inline void of_node_init(struct device_node *node) +{ +	kobject_init(&node->kobj, &of_node_ktype); +} + +/* true when node is initialized */ +static inline int of_node_is_initialized(struct device_node *node) +{ +	return node && node->kobj.state_initialized; +} + +/* true when node is attached (i.e. present on sysfs) */ +static inline int of_node_is_attached(struct device_node *node) +{ +	return node && node->kobj.state_in_sysfs; +} +  #ifdef CONFIG_OF_DYNAMIC  extern struct device_node *of_node_get(struct device_node *node);  extern void of_node_put(struct device_node *node); @@ -114,6 +135,26 @@ static inline void of_node_set_flag(struct device_node *n, unsigned long flag)  	set_bit(flag, &n->_flags);  } +static inline void of_node_clear_flag(struct device_node *n, unsigned long flag) +{ +	clear_bit(flag, &n->_flags); +} + +static inline int of_property_check_flag(struct property *p, unsigned long flag) +{ +	return test_bit(flag, &p->_flags); +} + +static inline void of_property_set_flag(struct property *p, unsigned long flag) +{ +	set_bit(flag, &p->_flags); +} + +static inline void of_property_clear_flag(struct property *p, unsigned long flag) +{ +	clear_bit(flag, &p->_flags); +} +  extern struct device_node *of_find_all_nodes(struct device_node *prev);  /* @@ -167,6 +208,8 @@ static inline const char *of_node_full_name(const struct device_node *np)  	return np ? np->full_name : "<no-node>";  } +#define for_each_of_allnodes(dn) \ +	for (dn = of_allnodes; dn; dn = dn->allnext)  extern struct device_node *of_find_node_by_name(struct device_node *from,  	const char *name);  extern struct device_node *of_find_node_by_type(struct device_node *from, @@ -198,6 +241,8 @@ extern struct device_node *of_find_node_with_property(  extern struct property *of_find_property(const struct device_node *np,  					 const char *name,  					 int *lenp); +extern int of_property_count_elems_of_size(const struct device_node *np, +				const char *propname, int elem_size);  extern int of_property_read_u32_index(const struct device_node *np,  				       const char *propname,  				       u32 index, u32 *out_value); @@ -390,6 +435,12 @@ static inline struct device_node *of_find_compatible_node(  	return NULL;  } +static inline int of_property_count_elems_of_size(const struct device_node *np, +			const char *propname, int elem_size) +{ +	return -ENOSYS; +} +  static inline int of_property_read_u32_index(const struct device_node *np,  			const char *propname, u32 index, u32 *out_value)  { @@ -536,6 +587,74 @@ static inline struct device_node *of_find_matching_node(  }  /** + * of_property_count_u8_elems - Count the number of u8 elements in a property + * + * @np:		device node from which the property value is to be read. + * @propname:	name of the property to be searched. + * + * Search for a property in a device node and count the number of u8 elements + * in it. Returns number of elements on sucess, -EINVAL if the property does + * not exist or its length does not match a multiple of u8 and -ENODATA if the + * property does not have a value. + */ +static inline int of_property_count_u8_elems(const struct device_node *np, +				const char *propname) +{ +	return of_property_count_elems_of_size(np, propname, sizeof(u8)); +} + +/** + * of_property_count_u16_elems - Count the number of u16 elements in a property + * + * @np:		device node from which the property value is to be read. + * @propname:	name of the property to be searched. + * + * Search for a property in a device node and count the number of u16 elements + * in it. Returns number of elements on sucess, -EINVAL if the property does + * not exist or its length does not match a multiple of u16 and -ENODATA if the + * property does not have a value. + */ +static inline int of_property_count_u16_elems(const struct device_node *np, +				const char *propname) +{ +	return of_property_count_elems_of_size(np, propname, sizeof(u16)); +} + +/** + * of_property_count_u32_elems - Count the number of u32 elements in a property + * + * @np:		device node from which the property value is to be read. + * @propname:	name of the property to be searched. + * + * Search for a property in a device node and count the number of u32 elements + * in it. Returns number of elements on sucess, -EINVAL if the property does + * not exist or its length does not match a multiple of u32 and -ENODATA if the + * property does not have a value. + */ +static inline int of_property_count_u32_elems(const struct device_node *np, +				const char *propname) +{ +	return of_property_count_elems_of_size(np, propname, sizeof(u32)); +} + +/** + * of_property_count_u64_elems - Count the number of u64 elements in a property + * + * @np:		device node from which the property value is to be read. + * @propname:	name of the property to be searched. + * + * Search for a property in a device node and count the number of u64 elements + * in it. Returns number of elements on sucess, -EINVAL if the property does + * not exist or its length does not match a multiple of u64 and -ENODATA if the + * property does not have a value. + */ +static inline int of_property_count_u64_elems(const struct device_node *np, +				const char *propname) +{ +	return of_property_count_elems_of_size(np, propname, sizeof(u64)); +} + +/**   * of_property_read_bool - Findfrom a property   * @np:		device node from which the property value is to be read.   * @propname:	name of the property to be searched. @@ -633,14 +752,4 @@ static inline int of_get_available_child_count(const struct device_node *np)  	return num;  } -#if defined(CONFIG_PROC_FS) && defined(CONFIG_PROC_DEVICETREE) -extern void proc_device_tree_add_node(struct device_node *, struct proc_dir_entry *); -extern void proc_device_tree_add_prop(struct proc_dir_entry *pde, struct property *prop); -extern void proc_device_tree_remove_prop(struct proc_dir_entry *pde, -					 struct property *prop); -extern void proc_device_tree_update_prop(struct proc_dir_entry *pde, -					 struct property *newprop, -					 struct property *oldprop); -#endif -  #endif /* _LINUX_OF_H */  | 
