1 /*
2  * Copyright (c) 2006-2023, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2023-04-12     ErikChan      the first version
9  */
10 
11 #ifndef __CORE_BUS_H__
12 #define __CORE_BUS_H__
13 
14 #include <rthw.h>
15 #include <rtdef.h>
16 #include <drivers/core/driver.h>
17 
18 typedef struct rt_bus *rt_bus_t;
19 
20 struct rt_bus
21 {
22     struct rt_object parent;    /**< inherit from rt_object */
23 
24     const char *name;
25 
26     rt_list_t list;
27     rt_list_t dev_list;
28     rt_list_t drv_list;
29 
30     struct rt_spinlock dev_lock;
31     struct rt_spinlock drv_lock;
32 
33     rt_bool_t (*match)(rt_driver_t drv, rt_device_t dev);
34     rt_err_t  (*probe)(rt_device_t dev);
35     rt_err_t  (*remove)(rt_device_t dev);
36     rt_err_t  (*shutdown)(rt_device_t dev);
37 };
38 
39 rt_err_t rt_bus_for_each_dev(rt_bus_t bus, void *data, int (*fn)(rt_device_t dev, void *));
40 rt_err_t rt_bus_for_each_drv(rt_bus_t bus, void *data, int (*fn)(rt_driver_t drv, void *));
41 
42 rt_err_t rt_bus_add_driver(rt_bus_t bus, rt_driver_t drv);
43 rt_err_t rt_bus_add_device(rt_bus_t bus, rt_device_t dev);
44 rt_err_t rt_bus_remove_driver(rt_driver_t drv);
45 rt_err_t rt_bus_remove_device(rt_device_t dev);
46 
47 rt_err_t rt_bus_shutdown(void);
48 
49 rt_bus_t rt_bus_find_by_name(const char *name);
50 rt_err_t rt_bus_reload_driver_device(rt_bus_t new_bus, rt_device_t dev);
51 
52 rt_err_t rt_bus_register(rt_bus_t bus);
53 
54 #endif /* __BUS_H__ */
55