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:
parent
e3ad7c13a0
commit
a39cd6fe4c
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue