forked from Mirrors/opensbi
		
	lib: utils: Add FDT match table based node lookup
This patch adds FDT match table based node lookup funcitons. These functions will be useful in implementing simple FDT based driver frameworks. Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Atish Patra <atish.patra@wdc.com>
This commit is contained in:
		@@ -10,6 +10,11 @@
 | 
			
		||||
#ifndef __FDT_HELPER_H__
 | 
			
		||||
#define __FDT_HELPER_H__
 | 
			
		||||
 | 
			
		||||
struct fdt_match {
 | 
			
		||||
	const char *compatible;
 | 
			
		||||
	void *data;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct platform_uart_data {
 | 
			
		||||
	unsigned long addr;
 | 
			
		||||
	unsigned long freq;
 | 
			
		||||
@@ -23,6 +28,12 @@ struct platform_plic_data {
 | 
			
		||||
	unsigned long num_src;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const struct fdt_match *fdt_match_node(void *fdt, int nodeoff,
 | 
			
		||||
				       const struct fdt_match *match_table);
 | 
			
		||||
 | 
			
		||||
int fdt_find_match(void *fdt, const struct fdt_match *match_table,
 | 
			
		||||
		   const struct fdt_match **out_match);
 | 
			
		||||
 | 
			
		||||
int fdt_parse_uart8250_node(void *fdt, int nodeoffset,
 | 
			
		||||
			    struct platform_uart_data *uart);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,47 @@
 | 
			
		||||
#define DEFAULT_UART_REG_SHIFT		0
 | 
			
		||||
#define DEFAULT_UART_REG_IO_WIDTH	1
 | 
			
		||||
 | 
			
		||||
const struct fdt_match *fdt_match_node(void *fdt, int nodeoff,
 | 
			
		||||
				       const struct fdt_match *match_table)
 | 
			
		||||
{
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	if (!fdt || nodeoff < 0 || !match_table)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	while (match_table->compatible) {
 | 
			
		||||
		ret = fdt_node_check_compatible(fdt, nodeoff,
 | 
			
		||||
						match_table->compatible);
 | 
			
		||||
		if (!ret)
 | 
			
		||||
			return match_table;
 | 
			
		||||
		match_table++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int fdt_find_match(void *fdt, const struct fdt_match *match_table,
 | 
			
		||||
		   const struct fdt_match **out_match)
 | 
			
		||||
{
 | 
			
		||||
	int nodeoff;
 | 
			
		||||
 | 
			
		||||
	if (!fdt || !match_table)
 | 
			
		||||
		return SBI_ENODEV;
 | 
			
		||||
 | 
			
		||||
	while (match_table->compatible) {
 | 
			
		||||
		nodeoff = fdt_node_offset_by_compatible(fdt, -1,
 | 
			
		||||
						match_table->compatible);
 | 
			
		||||
		if (nodeoff >= 0) {
 | 
			
		||||
			if (out_match)
 | 
			
		||||
				*out_match = match_table;
 | 
			
		||||
			return nodeoff;
 | 
			
		||||
		}
 | 
			
		||||
		match_table++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return SBI_ENODEV;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int fdt_get_node_addr_size(void *fdt, int node, unsigned long *addr,
 | 
			
		||||
				  unsigned long *size)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user