rsoc/rt-thread/components/legacy/fdt/inc/dtb_fwnode.h

126 lines
4.5 KiB
C
Raw Normal View History

2024-07-22 20:00:29 +08:00
#ifndef __DTB_FWNODE_H__
#define __DTB_FWNODE_H__
#include "libfdt_env.h"
#include <rtthread.h>
#include <stdint.h>
#include <stdbool.h>
struct fwnode_operations;
struct rt_device;
#define FWNODE_FLAG_LINKS_ADDED 0x01
#define FWNODE_FLAG_NOT_DEVICE 0x02
#define FWNODE_FLAG_INITIALIZED 0x04
#define NR_FWNODE_REFERENCE_ARGS 8
struct fwnode_handle
{
struct fwnode_handle *secondary;
const struct fwnode_operations *ops;
struct rt_device *dev;
struct rt_list_node suppliers;
struct rt_list_node consumers;
uint8_t flags;
};
struct fwnode_link
{
struct fwnode_handle *supplier;
struct rt_list_node s_hook;
struct fwnode_handle *consumer;
struct rt_list_node c_hook;
};
struct fwnode_endpoint
{
unsigned int port;
unsigned int id;
const struct fwnode_handle *local_fwnode;
};
struct fwnode_reference_args
{
struct fwnode_handle *fwnode;
unsigned int nargs;
uint64_t args[NR_FWNODE_REFERENCE_ARGS];
};
struct fwnode_operations
{
struct fwnode_handle *(*get)(struct fwnode_handle *fwnode);
void (*put)(struct fwnode_handle *fwnode);
bool (*device_is_available)(const struct fwnode_handle *fwnode);
const void *(*device_get_match_data)(const struct fwnode_handle *fwnode,
const struct rt_device *dev);
bool (*property_present)(const struct fwnode_handle *fwnode,
const char *propname);
int (*property_read_int_array)(const struct fwnode_handle *fwnode,
const char *propname,
unsigned int elem_size, void *val,
size_t nval);
int (*property_read_string_array)(const struct fwnode_handle *fwnode_handle,
const char *propname, const char **val,
size_t nval);
const char *(*get_name)(const struct fwnode_handle *fwnode);
const char *(*get_name_prefix)(const struct fwnode_handle *fwnode);
struct fwnode_handle *(*get_parent)(const struct fwnode_handle *fwnode);
struct fwnode_handle *(*get_next_child_node)(const struct fwnode_handle *fwnode,
struct fwnode_handle *child);
struct fwnode_handle *(*get_named_child_node)(const struct fwnode_handle *fwnode,
const char *name);
int (*get_reference_args)(const struct fwnode_handle *fwnode,
const char *prop, const char *nargs_prop,
unsigned int nargs, unsigned int index,
struct fwnode_reference_args *args);
struct fwnode_handle *(*graph_get_next_endpoint)(const struct fwnode_handle *fwnode,
struct fwnode_handle *prev);
struct fwnode_handle *(*graph_get_remote_endpoint)(const struct fwnode_handle *fwnode);
struct fwnode_handle *(*graph_get_port_parent)(struct fwnode_handle *fwnode);
int (*graph_parse_endpoint)(const struct fwnode_handle *fwnode,
struct fwnode_endpoint *endpoint);
int (*add_links)(struct fwnode_handle *fwnode);
};
#define fwnode_has_op(fwnode, op) \
((fwnode) && (fwnode)->ops && (fwnode)->ops->op)
#define fwnode_call_int_op(fwnode, op, ...) \
(fwnode ? (fwnode_has_op(fwnode, op) ? (fwnode)->ops->op(fwnode, ##__VA_ARGS__) : -ENXIO) : -EINVAL)
#define fwnode_call_bool_op(fwnode, op, ...) \
(fwnode_has_op(fwnode, op) ? (fwnode)->ops->op(fwnode, ##__VA_ARGS__) : false)
#define fwnode_call_ptr_op(fwnode, op, ...) \
(fwnode_has_op(fwnode, op) ? (fwnode)->ops->op(fwnode, ##__VA_ARGS__) : NULL)
#define fwnode_call_void_op(fwnode, op, ...) \
do \
{ \
if (fwnode_has_op(fwnode, op)) \
(fwnode)->ops->op(fwnode, ##__VA_ARGS__); \
} while (false)
#define get_dev_from_fwnode(fwnode) ((fwnode)->dev)
static inline void fwnode_init(struct fwnode_handle *fwnode,
const struct fwnode_operations *ops)
{
fwnode->ops = ops;
rt_list_init(&fwnode->consumers);
rt_list_init(&fwnode->suppliers);
}
static inline void fwnode_dev_initialized(struct fwnode_handle *fwnode,
bool initialized)
{
if (!fwnode)
return;
if (initialized)
fwnode->flags |= FWNODE_FLAG_INITIALIZED;
else
fwnode->flags &= ~FWNODE_FLAG_INITIALIZED;
}
#endif //__DTB_FWNODE_H__