mirror of
https://xff.cz/git/u-boot/
synced 2025-09-01 16:52:14 +02:00
imx: imx8qm/imx8qxp: Power down the resources before SPL jump to u-boot
Make sure that all devices that are powered up by SPL are powered down before entering into the u-boot. Otherwise the subsystem/device will never be powered down by SCFW, due to SPL and u-boot are in different partitions. Benefiting from power domain driver, this patch implements the function "imx8_power_off_pd_devices" to power off all active devices. Signed-off-by: Peng Fan <peng.fan@nxp.com>
This commit is contained in:
@@ -28,3 +28,4 @@ int print_bootinfo(void);
|
|||||||
int sc_pm_setup_uart(sc_rsrc_t uart_rsrc, sc_pm_clock_rate_t clk_rate);
|
int sc_pm_setup_uart(sc_rsrc_t uart_rsrc, sc_pm_clock_rate_t clk_rate);
|
||||||
int imx8_power_domain_lookup_name(const char *name,
|
int imx8_power_domain_lookup_name(const char *name,
|
||||||
struct power_domain *power_domain);
|
struct power_domain *power_domain);
|
||||||
|
void imx8_power_off_pd_devices(const char *permanent_on_devices[], int size);
|
||||||
|
@@ -12,6 +12,7 @@
|
|||||||
#include <dm/uclass-internal.h>
|
#include <dm/uclass-internal.h>
|
||||||
#include <dm/device-internal.h>
|
#include <dm/device-internal.h>
|
||||||
#include <dm/lists.h>
|
#include <dm/lists.h>
|
||||||
|
#include <asm/arch/sys_proto.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
@@ -37,6 +38,11 @@ void spl_board_init(void)
|
|||||||
puts("Normal Boot\n");
|
puts("Normal Boot\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void spl_board_prepare_for_boot(void)
|
||||||
|
{
|
||||||
|
imx8_power_off_pd_devices(NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SPL_LOAD_FIT
|
#ifdef CONFIG_SPL_LOAD_FIT
|
||||||
int board_fit_config_name_match(const char *name)
|
int board_fit_config_name_match(const char *name)
|
||||||
{
|
{
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
#include <asm/arch/sci/sci.h>
|
#include <asm/arch/sci/sci.h>
|
||||||
#include <asm/arch/imx8-pins.h>
|
#include <asm/arch/imx8-pins.h>
|
||||||
#include <asm/arch/iomux.h>
|
#include <asm/arch/iomux.h>
|
||||||
|
#include <asm/arch/sys_proto.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
@@ -55,6 +56,11 @@ void spl_board_init(void)
|
|||||||
puts("Normal Boot\n");
|
puts("Normal Boot\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void spl_board_prepare_for_boot(void)
|
||||||
|
{
|
||||||
|
imx_power_off_pd_devices(NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SPL_LOAD_FIT
|
#ifdef CONFIG_SPL_LOAD_FIT
|
||||||
int board_fit_config_name_match(const char *name)
|
int board_fit_config_name_match(const char *name)
|
||||||
{
|
{
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
#include <asm/arch/power-domain.h>
|
#include <asm/arch/power-domain.h>
|
||||||
#include <dm/device-internal.h>
|
#include <dm/device-internal.h>
|
||||||
#include <dm/device.h>
|
#include <dm/device.h>
|
||||||
|
#include <dm/uclass-internal.h>
|
||||||
#include <asm/arch/sci/sci.h>
|
#include <asm/arch/sci/sci.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
@@ -19,6 +20,40 @@ struct imx8_power_domain_priv {
|
|||||||
bool state_on;
|
bool state_on;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static bool check_device_power_off(struct udevice *dev,
|
||||||
|
const char *permanent_on_devices[],
|
||||||
|
int size)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++) {
|
||||||
|
if (!strcmp(dev->name, permanent_on_devices[i]))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void imx8_power_off_pd_devices(const char *permanent_on_devices[], int size)
|
||||||
|
{
|
||||||
|
struct udevice *dev;
|
||||||
|
struct power_domain pd;
|
||||||
|
|
||||||
|
for (uclass_find_first_device(UCLASS_POWER_DOMAIN, &dev); dev;
|
||||||
|
uclass_find_next_device(&dev)) {
|
||||||
|
if (!device_active(dev))
|
||||||
|
continue;
|
||||||
|
/*
|
||||||
|
* Power off active pd devices except the permanent
|
||||||
|
* power on devices
|
||||||
|
*/
|
||||||
|
if (check_device_power_off(dev, permanent_on_devices, size)) {
|
||||||
|
pd.dev = dev;
|
||||||
|
power_domain_off(&pd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int imx8_power_domain_lookup_name(const char *name,
|
int imx8_power_domain_lookup_name(const char *name,
|
||||||
struct power_domain *power_domain)
|
struct power_domain *power_domain)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user