123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- #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__
|