[Feature] Support simple power domain API (#9005)

* [Feature] Power domain for device

1.Support device power on/off.
2.Support attach/detach device.
3.Support power domain driver api.

Signed-off-by: GuEe-GUI <2991707448@qq.com>

* [DM/platform] Enhanced platform bus

1.Add power domain for device.
2.Support `remove` and `shutdown` bus interface.

Signed-off-by: GuEe-GUI <2991707448@qq.com>

---------

Signed-off-by: GuEe-GUI <2991707448@qq.com>
This commit is contained in:
GUI
2024-05-30 15:30:40 +08:00
committed by GitHub
parent 2cbe8bdae0
commit e7cddf3a52
10 changed files with 725 additions and 3 deletions
@@ -0,0 +1,85 @@
/*
* Copyright (c) 2006-2022, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2022-11-21 GuEe-GUI first version
*/
#ifndef __RT_DM_POWER_DOMAIN_H__
#define __RT_DM_POWER_DOMAIN_H__
#include <rthw.h>
#include <rtthread.h>
#include <ref.h>
#define RT_POWER_DOMAIN_OBJ_NAME "PMD"
#define RT_POWER_DOMAIN_PROXY_OBJ_NAME "PMP"
struct rt_ofw_node;
struct rt_ofw_cell_args;
struct rt_dm_power_domain_unit
{
rt_list_t list;
int id;
struct rt_dm_power_domain *domain;
};
struct rt_dm_power_domain_proxy
{
struct rt_object parent;
struct rt_dm_power_domain *(*ofw_parse)(struct rt_dm_power_domain_proxy *proxy,
struct rt_ofw_cell_args *args);
};
struct rt_dm_power_domain
{
struct rt_object parent;
struct rt_device *dev;
struct rt_dm_power_domain *parent_domain;
rt_list_t list;
rt_list_t child_nodes;
rt_list_t unit_nodes;
struct rt_ref ref;
struct rt_spinlock lock;
rt_err_t (*power_on)(struct rt_dm_power_domain *domain);
rt_err_t (*power_off)(struct rt_dm_power_domain *domain);
rt_err_t (*attach_dev)(struct rt_dm_power_domain *domain, struct rt_device *dev);
rt_err_t (*detach_dev)(struct rt_dm_power_domain *domain, struct rt_device *dev);
void *pirv;
};
void rt_dm_power_domain_proxy_default_name(struct rt_dm_power_domain_proxy *proxy);
void rt_dm_power_domain_proxy_ofw_bind(struct rt_dm_power_domain_proxy *proxy,
struct rt_ofw_node *np);
rt_err_t rt_dm_power_domain_register(struct rt_dm_power_domain *domain);
rt_err_t rt_dm_power_domain_unregister(struct rt_dm_power_domain *domain);
rt_err_t rt_dm_power_domain_register_child(struct rt_dm_power_domain *domain,
struct rt_dm_power_domain *child_domain);
rt_err_t rt_dm_power_domain_unregister_child(struct rt_dm_power_domain *domain,
struct rt_dm_power_domain *child_domain);
rt_err_t rt_dm_power_domain_power_on(struct rt_dm_power_domain *domain);
rt_err_t rt_dm_power_domain_power_off(struct rt_dm_power_domain *domain);
struct rt_dm_power_domain *rt_dm_power_domain_get_by_index(struct rt_device *dev, int index);
struct rt_dm_power_domain *rt_dm_power_domain_get_by_name(struct rt_device *dev, const char *name);
rt_err_t rt_dm_power_domain_put(struct rt_dm_power_domain *domain);
rt_err_t rt_dm_power_domain_attach(struct rt_device *dev, rt_bool_t on);
rt_err_t rt_dm_power_domain_detach(struct rt_device *dev, rt_bool_t off);
#endif /* __RT_DM_POWER_DOMAIN_H__ */
+2
View File
@@ -430,6 +430,8 @@ rt_inline rt_bool_t rt_ofw_node_is_type(const struct rt_ofw_node *np, const char
struct rt_ofw_stub *rt_ofw_stub_probe_range(struct rt_ofw_node *np,
const struct rt_ofw_stub *stub_start, const struct rt_ofw_stub *stub_end);
struct rt_object *rt_ofw_parse_object(struct rt_ofw_node *np, const char *obj_name, const char *cells_name);
rt_err_t rt_ofw_console_setup(void);
const char *rt_ofw_bootargs_select(const char *key, int index);
@@ -54,6 +54,7 @@ rt_err_t rt_platform_driver_register(struct rt_platform_driver *pdrv);
rt_err_t rt_platform_device_register(struct rt_platform_device *pdev);
rt_err_t rt_platform_ofw_device_probe_child(struct rt_ofw_node *np);
rt_err_t rt_platform_ofw_free(struct rt_platform_device *pdev);
#define RT_PLATFORM_DRIVER_EXPORT(driver) RT_DRIVER_EXPORT(driver, platform, BUILIN)
+1
View File
@@ -42,6 +42,7 @@ extern "C" {
#ifdef RT_USING_DM
#include "drivers/core/dm.h"
#include "drivers/core/numa.h"
#include "drivers/core/power_domain.h"
#include "drivers/platform.h"
#ifdef RT_USING_OFW