1 /*
2  * Copyright (c) 2006-2022, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2022-11-21     GuEe-GUI     first version
9  */
10 
11 #ifndef __RT_DM_POWER_DOMAIN_H__
12 #define __RT_DM_POWER_DOMAIN_H__
13 
14 #include <rthw.h>
15 #include <rtthread.h>
16 
17 #include <ref.h>
18 
19 #define RT_POWER_DOMAIN_OBJ_NAME        "PMD"
20 #define RT_POWER_DOMAIN_PROXY_OBJ_NAME  "PMP"
21 
22 struct rt_ofw_node;
23 struct rt_ofw_cell_args;
24 
25 struct rt_dm_power_domain_unit
26 {
27     rt_list_t list;
28 
29     int id;
30     struct rt_dm_power_domain *domain;
31 };
32 
33 struct rt_dm_power_domain_proxy
34 {
35     struct rt_object parent;
36 
37     struct rt_dm_power_domain *(*ofw_parse)(struct rt_dm_power_domain_proxy *proxy,
38             struct rt_ofw_cell_args *args);
39 };
40 
41 struct rt_dm_power_domain
42 {
43     struct rt_object parent;
44 
45     struct rt_device *dev;
46     struct rt_dm_power_domain *parent_domain;
47 
48     rt_list_t list;
49     rt_list_t child_nodes;
50     rt_list_t unit_nodes;
51 
52     struct rt_ref ref;
53     struct rt_spinlock lock;
54 
55     rt_err_t (*power_on)(struct rt_dm_power_domain *domain);
56     rt_err_t (*power_off)(struct rt_dm_power_domain *domain);
57     rt_err_t (*attach_dev)(struct rt_dm_power_domain *domain, struct rt_device *dev);
58     rt_err_t (*detach_dev)(struct rt_dm_power_domain *domain, struct rt_device *dev);
59 
60     void *pirv;
61 };
62 
63 void rt_dm_power_domain_proxy_default_name(struct rt_dm_power_domain_proxy *proxy);
64 void rt_dm_power_domain_proxy_ofw_bind(struct rt_dm_power_domain_proxy *proxy,
65         struct rt_ofw_node *np);
66 
67 rt_err_t rt_dm_power_domain_register(struct rt_dm_power_domain *domain);
68 rt_err_t rt_dm_power_domain_unregister(struct rt_dm_power_domain *domain);
69 
70 rt_err_t rt_dm_power_domain_register_child(struct rt_dm_power_domain *domain,
71         struct rt_dm_power_domain *child_domain);
72 rt_err_t rt_dm_power_domain_unregister_child(struct rt_dm_power_domain *domain,
73         struct rt_dm_power_domain *child_domain);
74 
75 rt_err_t rt_dm_power_domain_power_on(struct rt_dm_power_domain *domain);
76 rt_err_t rt_dm_power_domain_power_off(struct rt_dm_power_domain *domain);
77 
78 struct rt_dm_power_domain *rt_dm_power_domain_get_by_index(struct rt_device *dev, int index);
79 struct rt_dm_power_domain *rt_dm_power_domain_get_by_name(struct rt_device *dev, const char *name);
80 rt_err_t rt_dm_power_domain_put(struct rt_dm_power_domain *domain);
81 
82 rt_err_t rt_dm_power_domain_attach(struct rt_device *dev, rt_bool_t on);
83 rt_err_t rt_dm_power_domain_detach(struct rt_device *dev, rt_bool_t off);
84 
85 #endif /* __RT_DM_POWER_DOMAIN_H__ */
86