mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	sparc: Create common area for OF device layer code.
This is where common code implementations will go as we unify 32-bit and 64-bit OF device tree code. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									ab04323e5b
								
							
						
					
					
						commit
						dfa76060be
					
				
					 4 changed files with 122 additions and 188 deletions
				
			
		|  | @ -35,6 +35,7 @@ obj-y                   += ptrace_$(BITS).o | ||||||
| obj-y                   += unaligned_$(BITS).o | obj-y                   += unaligned_$(BITS).o | ||||||
| obj-y                   += una_asm_$(BITS).o | obj-y                   += una_asm_$(BITS).o | ||||||
| obj-$(CONFIG_SPARC32)   += muldiv.o | obj-$(CONFIG_SPARC32)   += muldiv.o | ||||||
|  | obj-y                   += prom_common.o | ||||||
| obj-y                   += prom_$(BITS).o | obj-y                   += prom_$(BITS).o | ||||||
| obj-y                   += of_device_$(BITS).o | obj-y                   += of_device_$(BITS).o | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -27,100 +27,6 @@ | ||||||
| 
 | 
 | ||||||
| #include "prom.h" | #include "prom.h" | ||||||
| 
 | 
 | ||||||
| struct device_node *of_find_node_by_phandle(phandle handle) |  | ||||||
| { |  | ||||||
| 	struct device_node *np; |  | ||||||
| 
 |  | ||||||
| 	for (np = allnodes; np != 0; np = np->allnext) |  | ||||||
| 		if (np->node == handle) |  | ||||||
| 			break; |  | ||||||
| 
 |  | ||||||
| 	return np; |  | ||||||
| } |  | ||||||
| EXPORT_SYMBOL(of_find_node_by_phandle); |  | ||||||
| 
 |  | ||||||
| int of_getintprop_default(struct device_node *np, const char *name, int def) |  | ||||||
| { |  | ||||||
| 	struct property *prop; |  | ||||||
| 	int len; |  | ||||||
| 
 |  | ||||||
| 	prop = of_find_property(np, name, &len); |  | ||||||
| 	if (!prop || len != 4) |  | ||||||
| 		return def; |  | ||||||
| 
 |  | ||||||
| 	return *(int *) prop->value; |  | ||||||
| } |  | ||||||
| EXPORT_SYMBOL(of_getintprop_default); |  | ||||||
| 
 |  | ||||||
| DEFINE_MUTEX(of_set_property_mutex); |  | ||||||
| EXPORT_SYMBOL(of_set_property_mutex); |  | ||||||
| 
 |  | ||||||
| int of_set_property(struct device_node *dp, const char *name, void *val, int len) |  | ||||||
| { |  | ||||||
| 	struct property **prevp; |  | ||||||
| 	void *new_val; |  | ||||||
| 	int err; |  | ||||||
| 
 |  | ||||||
| 	new_val = kmalloc(len, GFP_KERNEL); |  | ||||||
| 	if (!new_val) |  | ||||||
| 		return -ENOMEM; |  | ||||||
| 
 |  | ||||||
| 	memcpy(new_val, val, len); |  | ||||||
| 
 |  | ||||||
| 	err = -ENODEV; |  | ||||||
| 
 |  | ||||||
| 	write_lock(&devtree_lock); |  | ||||||
| 	prevp = &dp->properties; |  | ||||||
| 	while (*prevp) { |  | ||||||
| 		struct property *prop = *prevp; |  | ||||||
| 
 |  | ||||||
| 		if (!strcasecmp(prop->name, name)) { |  | ||||||
| 			void *old_val = prop->value; |  | ||||||
| 			int ret; |  | ||||||
| 
 |  | ||||||
| 			mutex_lock(&of_set_property_mutex); |  | ||||||
| 			ret = prom_setprop(dp->node, (char *) name, val, len); |  | ||||||
| 			mutex_unlock(&of_set_property_mutex); |  | ||||||
| 
 |  | ||||||
| 			err = -EINVAL; |  | ||||||
| 			if (ret >= 0) { |  | ||||||
| 				prop->value = new_val; |  | ||||||
| 				prop->length = len; |  | ||||||
| 
 |  | ||||||
| 				if (OF_IS_DYNAMIC(prop)) |  | ||||||
| 					kfree(old_val); |  | ||||||
| 
 |  | ||||||
| 				OF_MARK_DYNAMIC(prop); |  | ||||||
| 
 |  | ||||||
| 				err = 0; |  | ||||||
| 			} |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 		prevp = &(*prevp)->next; |  | ||||||
| 	} |  | ||||||
| 	write_unlock(&devtree_lock); |  | ||||||
| 
 |  | ||||||
| 	/* XXX Upate procfs if necessary... */ |  | ||||||
| 
 |  | ||||||
| 	return err; |  | ||||||
| } |  | ||||||
| EXPORT_SYMBOL(of_set_property); |  | ||||||
| 
 |  | ||||||
| int of_find_in_proplist(const char *list, const char *match, int len) |  | ||||||
| { |  | ||||||
| 	while (len > 0) { |  | ||||||
| 		int l; |  | ||||||
| 
 |  | ||||||
| 		if (!strcmp(list, match)) |  | ||||||
| 			return 1; |  | ||||||
| 		l = strlen(list) + 1; |  | ||||||
| 		list += l; |  | ||||||
| 		len -= l; |  | ||||||
| 	} |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| EXPORT_SYMBOL(of_find_in_proplist); |  | ||||||
| 
 |  | ||||||
| static unsigned int prom_early_allocated; | static unsigned int prom_early_allocated; | ||||||
| 
 | 
 | ||||||
| static void * __init prom_early_alloc(unsigned long size) | static void * __init prom_early_alloc(unsigned long size) | ||||||
|  |  | ||||||
|  | @ -32,100 +32,6 @@ | ||||||
| 
 | 
 | ||||||
| #include "prom.h" | #include "prom.h" | ||||||
| 
 | 
 | ||||||
| struct device_node *of_find_node_by_phandle(phandle handle) |  | ||||||
| { |  | ||||||
| 	struct device_node *np; |  | ||||||
| 
 |  | ||||||
| 	for (np = allnodes; np; np = np->allnext) |  | ||||||
| 		if (np->node == handle) |  | ||||||
| 			break; |  | ||||||
| 
 |  | ||||||
| 	return np; |  | ||||||
| } |  | ||||||
| EXPORT_SYMBOL(of_find_node_by_phandle); |  | ||||||
| 
 |  | ||||||
| int of_getintprop_default(struct device_node *np, const char *name, int def) |  | ||||||
| { |  | ||||||
| 	struct property *prop; |  | ||||||
| 	int len; |  | ||||||
| 
 |  | ||||||
| 	prop = of_find_property(np, name, &len); |  | ||||||
| 	if (!prop || len != 4) |  | ||||||
| 		return def; |  | ||||||
| 
 |  | ||||||
| 	return *(int *) prop->value; |  | ||||||
| } |  | ||||||
| EXPORT_SYMBOL(of_getintprop_default); |  | ||||||
| 
 |  | ||||||
| DEFINE_MUTEX(of_set_property_mutex); |  | ||||||
| EXPORT_SYMBOL(of_set_property_mutex); |  | ||||||
| 
 |  | ||||||
| int of_set_property(struct device_node *dp, const char *name, void *val, int len) |  | ||||||
| { |  | ||||||
| 	struct property **prevp; |  | ||||||
| 	void *new_val; |  | ||||||
| 	int err; |  | ||||||
| 
 |  | ||||||
| 	new_val = kmalloc(len, GFP_KERNEL); |  | ||||||
| 	if (!new_val) |  | ||||||
| 		return -ENOMEM; |  | ||||||
| 
 |  | ||||||
| 	memcpy(new_val, val, len); |  | ||||||
| 
 |  | ||||||
| 	err = -ENODEV; |  | ||||||
| 
 |  | ||||||
| 	write_lock(&devtree_lock); |  | ||||||
| 	prevp = &dp->properties; |  | ||||||
| 	while (*prevp) { |  | ||||||
| 		struct property *prop = *prevp; |  | ||||||
| 
 |  | ||||||
| 		if (!strcasecmp(prop->name, name)) { |  | ||||||
| 			void *old_val = prop->value; |  | ||||||
| 			int ret; |  | ||||||
| 
 |  | ||||||
| 			mutex_lock(&of_set_property_mutex); |  | ||||||
| 			ret = prom_setprop(dp->node, name, val, len); |  | ||||||
| 			mutex_unlock(&of_set_property_mutex); |  | ||||||
| 
 |  | ||||||
| 			err = -EINVAL; |  | ||||||
| 			if (ret >= 0) { |  | ||||||
| 				prop->value = new_val; |  | ||||||
| 				prop->length = len; |  | ||||||
| 
 |  | ||||||
| 				if (OF_IS_DYNAMIC(prop)) |  | ||||||
| 					kfree(old_val); |  | ||||||
| 
 |  | ||||||
| 				OF_MARK_DYNAMIC(prop); |  | ||||||
| 
 |  | ||||||
| 				err = 0; |  | ||||||
| 			} |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 		prevp = &(*prevp)->next; |  | ||||||
| 	} |  | ||||||
| 	write_unlock(&devtree_lock); |  | ||||||
| 
 |  | ||||||
| 	/* XXX Upate procfs if necessary... */ |  | ||||||
| 
 |  | ||||||
| 	return err; |  | ||||||
| } |  | ||||||
| EXPORT_SYMBOL(of_set_property); |  | ||||||
| 
 |  | ||||||
| int of_find_in_proplist(const char *list, const char *match, int len) |  | ||||||
| { |  | ||||||
| 	while (len > 0) { |  | ||||||
| 		int l; |  | ||||||
| 
 |  | ||||||
| 		if (!strcmp(list, match)) |  | ||||||
| 			return 1; |  | ||||||
| 		l = strlen(list) + 1; |  | ||||||
| 		list += l; |  | ||||||
| 		len -= l; |  | ||||||
| 	} |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| EXPORT_SYMBOL(of_find_in_proplist); |  | ||||||
| 
 |  | ||||||
| static unsigned int prom_early_allocated __initdata; | static unsigned int prom_early_allocated __initdata; | ||||||
| 
 | 
 | ||||||
| static void * __init prom_early_alloc(unsigned long size) | static void * __init prom_early_alloc(unsigned long size) | ||||||
|  |  | ||||||
							
								
								
									
										121
									
								
								arch/sparc/kernel/prom_common.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								arch/sparc/kernel/prom_common.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,121 @@ | ||||||
|  | /* prom_common.c: OF device tree support common code.
 | ||||||
|  |  * | ||||||
|  |  * Paul Mackerras	August 1996. | ||||||
|  |  * Copyright (C) 1996-2005 Paul Mackerras. | ||||||
|  |  * | ||||||
|  |  *  Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner. | ||||||
|  |  *    {engebret|bergner}@us.ibm.com | ||||||
|  |  * | ||||||
|  |  *  Adapted for sparc by David S. Miller davem@davemloft.net | ||||||
|  |  * | ||||||
|  |  *      This program is free software; you can redistribute it and/or | ||||||
|  |  *      modify it under the terms of the GNU General Public License | ||||||
|  |  *      as published by the Free Software Foundation; either version | ||||||
|  |  *      2 of the License, or (at your option) any later version. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <linux/kernel.h> | ||||||
|  | #include <linux/module.h> | ||||||
|  | #include <linux/errno.h> | ||||||
|  | #include <linux/mutex.h> | ||||||
|  | #include <linux/slab.h> | ||||||
|  | #include <linux/of.h> | ||||||
|  | #include <asm/prom.h> | ||||||
|  | #include <asm/oplib.h> | ||||||
|  | 
 | ||||||
|  | #include "prom.h" | ||||||
|  | 
 | ||||||
|  | struct device_node *of_find_node_by_phandle(phandle handle) | ||||||
|  | { | ||||||
|  | 	struct device_node *np; | ||||||
|  | 
 | ||||||
|  | 	for (np = allnodes; np; np = np->allnext) | ||||||
|  | 		if (np->node == handle) | ||||||
|  | 			break; | ||||||
|  | 
 | ||||||
|  | 	return np; | ||||||
|  | } | ||||||
|  | EXPORT_SYMBOL(of_find_node_by_phandle); | ||||||
|  | 
 | ||||||
|  | int of_getintprop_default(struct device_node *np, const char *name, int def) | ||||||
|  | { | ||||||
|  | 	struct property *prop; | ||||||
|  | 	int len; | ||||||
|  | 
 | ||||||
|  | 	prop = of_find_property(np, name, &len); | ||||||
|  | 	if (!prop || len != 4) | ||||||
|  | 		return def; | ||||||
|  | 
 | ||||||
|  | 	return *(int *) prop->value; | ||||||
|  | } | ||||||
|  | EXPORT_SYMBOL(of_getintprop_default); | ||||||
|  | 
 | ||||||
|  | DEFINE_MUTEX(of_set_property_mutex); | ||||||
|  | EXPORT_SYMBOL(of_set_property_mutex); | ||||||
|  | 
 | ||||||
|  | int of_set_property(struct device_node *dp, const char *name, void *val, int len) | ||||||
|  | { | ||||||
|  | 	struct property **prevp; | ||||||
|  | 	void *new_val; | ||||||
|  | 	int err; | ||||||
|  | 
 | ||||||
|  | 	new_val = kmalloc(len, GFP_KERNEL); | ||||||
|  | 	if (!new_val) | ||||||
|  | 		return -ENOMEM; | ||||||
|  | 
 | ||||||
|  | 	memcpy(new_val, val, len); | ||||||
|  | 
 | ||||||
|  | 	err = -ENODEV; | ||||||
|  | 
 | ||||||
|  | 	write_lock(&devtree_lock); | ||||||
|  | 	prevp = &dp->properties; | ||||||
|  | 	while (*prevp) { | ||||||
|  | 		struct property *prop = *prevp; | ||||||
|  | 
 | ||||||
|  | 		if (!strcasecmp(prop->name, name)) { | ||||||
|  | 			void *old_val = prop->value; | ||||||
|  | 			int ret; | ||||||
|  | 
 | ||||||
|  | 			mutex_lock(&of_set_property_mutex); | ||||||
|  | 			ret = prom_setprop(dp->node, name, val, len); | ||||||
|  | 			mutex_unlock(&of_set_property_mutex); | ||||||
|  | 
 | ||||||
|  | 			err = -EINVAL; | ||||||
|  | 			if (ret >= 0) { | ||||||
|  | 				prop->value = new_val; | ||||||
|  | 				prop->length = len; | ||||||
|  | 
 | ||||||
|  | 				if (OF_IS_DYNAMIC(prop)) | ||||||
|  | 					kfree(old_val); | ||||||
|  | 
 | ||||||
|  | 				OF_MARK_DYNAMIC(prop); | ||||||
|  | 
 | ||||||
|  | 				err = 0; | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 		prevp = &(*prevp)->next; | ||||||
|  | 	} | ||||||
|  | 	write_unlock(&devtree_lock); | ||||||
|  | 
 | ||||||
|  | 	/* XXX Upate procfs if necessary... */ | ||||||
|  | 
 | ||||||
|  | 	return err; | ||||||
|  | } | ||||||
|  | EXPORT_SYMBOL(of_set_property); | ||||||
|  | 
 | ||||||
|  | int of_find_in_proplist(const char *list, const char *match, int len) | ||||||
|  | { | ||||||
|  | 	while (len > 0) { | ||||||
|  | 		int l; | ||||||
|  | 
 | ||||||
|  | 		if (!strcmp(list, match)) | ||||||
|  | 			return 1; | ||||||
|  | 		l = strlen(list) + 1; | ||||||
|  | 		list += l; | ||||||
|  | 		len -= l; | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | EXPORT_SYMBOL(of_find_in_proplist); | ||||||
|  | 
 | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 David S. Miller
						David S. Miller