162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright 2021 Linaro Limited
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Author: Daniel Lezcano <daniel.lezcano@linaro.org>
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * DTPM hierarchy description
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci#include <linux/dtpm.h>
1062306a36Sopenharmony_ci#include <linux/module.h>
1162306a36Sopenharmony_ci#include <linux/of.h>
1262306a36Sopenharmony_ci#include <linux/platform_device.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistatic struct dtpm_node __initdata rk3399_hierarchy[] = {
1562306a36Sopenharmony_ci	[0] = { .name = "rk3399",
1662306a36Sopenharmony_ci		.type = DTPM_NODE_VIRTUAL },
1762306a36Sopenharmony_ci	[1] = { .name = "package",
1862306a36Sopenharmony_ci		.type = DTPM_NODE_VIRTUAL,
1962306a36Sopenharmony_ci		.parent = &rk3399_hierarchy[0] },
2062306a36Sopenharmony_ci	[2] = { .name = "/cpus/cpu@0",
2162306a36Sopenharmony_ci		.type = DTPM_NODE_DT,
2262306a36Sopenharmony_ci		.parent = &rk3399_hierarchy[1] },
2362306a36Sopenharmony_ci	[3] = { .name = "/cpus/cpu@1",
2462306a36Sopenharmony_ci		.type = DTPM_NODE_DT,
2562306a36Sopenharmony_ci		.parent = &rk3399_hierarchy[1] },
2662306a36Sopenharmony_ci	[4] = { .name = "/cpus/cpu@2",
2762306a36Sopenharmony_ci		.type = DTPM_NODE_DT,
2862306a36Sopenharmony_ci		.parent = &rk3399_hierarchy[1] },
2962306a36Sopenharmony_ci	[5] = { .name = "/cpus/cpu@3",
3062306a36Sopenharmony_ci		.type = DTPM_NODE_DT,
3162306a36Sopenharmony_ci		.parent = &rk3399_hierarchy[1] },
3262306a36Sopenharmony_ci	[6] = { .name = "/cpus/cpu@100",
3362306a36Sopenharmony_ci		.type = DTPM_NODE_DT,
3462306a36Sopenharmony_ci		.parent = &rk3399_hierarchy[1] },
3562306a36Sopenharmony_ci	[7] = { .name = "/cpus/cpu@101",
3662306a36Sopenharmony_ci		.type = DTPM_NODE_DT,
3762306a36Sopenharmony_ci		.parent = &rk3399_hierarchy[1] },
3862306a36Sopenharmony_ci	[8] = { .name = "/gpu@ff9a0000",
3962306a36Sopenharmony_ci		.type = DTPM_NODE_DT,
4062306a36Sopenharmony_ci		.parent = &rk3399_hierarchy[1] },
4162306a36Sopenharmony_ci	[9] = { /* sentinel */ }
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistatic struct of_device_id __initdata rockchip_dtpm_match_table[] = {
4562306a36Sopenharmony_ci        { .compatible = "rockchip,rk3399", .data = rk3399_hierarchy },
4662306a36Sopenharmony_ci        {},
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistatic int __init rockchip_dtpm_init(void)
5062306a36Sopenharmony_ci{
5162306a36Sopenharmony_ci	return dtpm_create_hierarchy(rockchip_dtpm_match_table);
5262306a36Sopenharmony_ci}
5362306a36Sopenharmony_cimodule_init(rockchip_dtpm_init);
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistatic void __exit rockchip_dtpm_exit(void)
5662306a36Sopenharmony_ci{
5762306a36Sopenharmony_ci	return dtpm_destroy_hierarchy();
5862306a36Sopenharmony_ci}
5962306a36Sopenharmony_cimodule_exit(rockchip_dtpm_exit);
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ciMODULE_SOFTDEP("pre: panfrost cpufreq-dt");
6262306a36Sopenharmony_ciMODULE_DESCRIPTION("Rockchip DTPM driver");
6362306a36Sopenharmony_ciMODULE_LICENSE("GPL");
6462306a36Sopenharmony_ciMODULE_ALIAS("platform:dtpm");
6562306a36Sopenharmony_ciMODULE_AUTHOR("Daniel Lezcano <daniel.lezcano@kernel.org");
66