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