/* * SPDX-License-Identifier: BSD-2-Clause * * fdt_driver.h - Generic support for initializing drivers from DT nodes. * * Copyright (c) 2024 SiFive */ #ifndef __FDT_DRIVER_H__ #define __FDT_DRIVER_H__ #include struct fdt_driver { const struct fdt_match *match_table; int (*init)(const void *fdt, int nodeoff, const struct fdt_match *match); bool experimental; }; /* List of early FDT drivers generated at compile time */ extern const struct fdt_driver *const fdt_early_drivers[]; /** * Initialize a driver instance for a specific DT node * * @param fdt devicetree blob * @param nodeoff offset of a node in the devicetree blob * @param drivers NULL-terminated array of drivers to match against this node * * @return 0 if a driver was matched and successfully initialized or a negative * error code on failure */ int fdt_driver_init_by_offset(const void *fdt, int nodeoff, const struct fdt_driver *const *drivers); /** * Initialize a driver instance for each DT node that matches any of the * provided drivers * * @param fdt devicetree blob * @param drivers NULL-terminated array of drivers to match against each node * * @return 0 if drivers for all matches (if any) were successfully initialized * or a negative error code on failure */ int fdt_driver_init_all(const void *fdt, const struct fdt_driver *const *drivers); /** * Initialize a driver instance for the first DT node that matches any of the * provided drivers * * @param fdt devicetree blob * @param drivers NULL-terminated array of drivers to match against each node * * @return 0 if a driver was matched and successfully initialized or a negative * error code on failure */ int fdt_driver_init_one(const void *fdt, const struct fdt_driver *const *drivers); #endif /* __FDT_DRIVER_H__ */