power: domain: add i.MX8 scu power domain driver
The power domain tree is not accepted by Linux Kernel upstream.
only a single pd node is used currently, as following:
pd: imx8qx-pd {
compatible = "fsl,imx8qm-scu-pd", "fsl,scu-pd";
#power-domain-cells = <1>;
};
So to migrate to use upstream linux dts, we also need a driver
to support this.
This patch is to support the new method, compared with legacy power
domain tree, it will be simpiler, because each device will
has resource id as power domain index, it will be directly passed
to scfw, and no need to let power domain build that tree. If multiple
power domain is needed, it is the dts node should has correctly power
domains entry added and sequence correct.
Signed-off-by: Peng Fan <peng.fan@nxp.com>
2019-09-02 10:16:32 +00:00
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
/*
|
|
|
|
* Copyright 2019 NXP
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define DEBUG
|
|
|
|
#include <common.h>
|
|
|
|
#include <dm.h>
|
2020-05-10 17:40:05 +00:00
|
|
|
#include <log.h>
|
2020-02-03 14:36:16 +00:00
|
|
|
#include <malloc.h>
|
power: domain: add i.MX8 scu power domain driver
The power domain tree is not accepted by Linux Kernel upstream.
only a single pd node is used currently, as following:
pd: imx8qx-pd {
compatible = "fsl,imx8qm-scu-pd", "fsl,scu-pd";
#power-domain-cells = <1>;
};
So to migrate to use upstream linux dts, we also need a driver
to support this.
This patch is to support the new method, compared with legacy power
domain tree, it will be simpiler, because each device will
has resource id as power domain index, it will be directly passed
to scfw, and no need to let power domain build that tree. If multiple
power domain is needed, it is the dts node should has correctly power
domains entry added and sequence correct.
Signed-off-by: Peng Fan <peng.fan@nxp.com>
2019-09-02 10:16:32 +00:00
|
|
|
#include <power-domain-uclass.h>
|
|
|
|
#include <asm/arch/power-domain.h>
|
|
|
|
#include <asm/arch/sci/sci.h>
|
|
|
|
|
|
|
|
static int imx8_power_domain_on(struct power_domain *power_domain)
|
|
|
|
{
|
|
|
|
u32 resource_id = power_domain->id;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
debug("%s: resource_id %u\n", __func__, resource_id);
|
|
|
|
|
|
|
|
ret = sc_pm_set_resource_power_mode(-1, resource_id, SC_PM_PW_MODE_ON);
|
|
|
|
if (ret) {
|
|
|
|
printf("Error: %u Power up failed! (error = %d)\n",
|
|
|
|
resource_id, ret);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int imx8_power_domain_off(struct power_domain *power_domain)
|
|
|
|
{
|
|
|
|
u32 resource_id = power_domain->id;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
debug("%s: resource_id %u\n", __func__, resource_id);
|
|
|
|
|
|
|
|
ret = sc_pm_set_resource_power_mode(-1, resource_id, SC_PM_PW_MODE_OFF);
|
|
|
|
if (ret) {
|
|
|
|
printf("Error: %u Power off failed! (error = %d)\n",
|
|
|
|
resource_id, ret);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const struct udevice_id imx8_power_domain_ids[] = {
|
|
|
|
{ .compatible = "fsl,imx8qxp-scu-pd" },
|
|
|
|
{ .compatible = "fsl,scu-pd" },
|
|
|
|
{ }
|
|
|
|
};
|
|
|
|
|
|
|
|
struct power_domain_ops imx8_power_domain_ops_v2 = {
|
|
|
|
.on = imx8_power_domain_on,
|
|
|
|
.off = imx8_power_domain_off,
|
|
|
|
};
|
|
|
|
|
|
|
|
U_BOOT_DRIVER(imx8_power_domain_v2) = {
|
|
|
|
.name = "imx8_power_domain_v2",
|
|
|
|
.id = UCLASS_POWER_DOMAIN,
|
|
|
|
.of_match = imx8_power_domain_ids,
|
|
|
|
.ops = &imx8_power_domain_ops_v2,
|
|
|
|
};
|