From 0dd51748c2a6783d9686ce5342613bb7da6d3501 Mon Sep 17 00:00:00 2001 From: Jon Nettleton Date: Sun, 16 Dec 2018 13:13:40 +0100 Subject: [PATCH] imx: Add gpc power control function This adds a generic controller function to handle the various GPC power regions. For the HB Pulse we use this to power off both PCIE regions on boot to help return the devices to a sane state on reboot and sudden power off. Signed-off-by: Jon Nettleton --- arch/arm/include/asm/arch-imx8m/sys_proto.h | 1 + arch/arm/mach-imx/imx8m/soc.c | 16 +++++++++++++++- board/solidrun/imx8mq_hb/imx8mq_hb.c | 3 +++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/arch/arm/include/asm/arch-imx8m/sys_proto.h b/arch/arm/include/asm/arch-imx8m/sys_proto.h index 3e54f9b6764a..069dc3579621 100644 --- a/arch/arm/include/asm/arch-imx8m/sys_proto.h +++ b/arch/arm/include/asm/arch-imx8m/sys_proto.h @@ -12,6 +12,7 @@ void set_wdog_reset(struct wdog_regs *wdog); void enable_tzc380(void); void restore_boot_params(void); int imx8m_usb_power(int usb_id, bool on); +int imx8m_gpc_power(int id, bool on); extern unsigned long rom_pointer[]; enum boot_device get_boot_device(void); bool is_usb_boot(void); diff --git a/arch/arm/mach-imx/imx8m/soc.c b/arch/arm/mach-imx/imx8m/soc.c index f8fc3bcbe76d..676fc236ba70 100644 --- a/arch/arm/mach-imx/imx8m/soc.c +++ b/arch/arm/mach-imx/imx8m/soc.c @@ -236,9 +236,10 @@ void reset_cpu(ulong addr) } } -#ifdef CONFIG_USB_XHCI_IMX8M #define FSL_SIP_GPC 0xC2000000 #define FSL_SIP_CONFIG_GPC_PM_DOMAIN 0x03 + +#ifdef CONFIG_USB_XHCI_IMX8M int imx8m_usb_power(int usb_id, bool on) { unsigned long ret; @@ -254,3 +255,16 @@ int imx8m_usb_power(int usb_id, bool on) return 0; } #endif + +int imx8m_gpc_power(int id, bool on) +{ + unsigned long ret; + + ret = call_imx_sip(FSL_SIP_GPC, + FSL_SIP_CONFIG_GPC_PM_DOMAIN, id, on, 0); + if (ret) + return -EPERM; + + return 0; +} + diff --git a/board/solidrun/imx8mq_hb/imx8mq_hb.c b/board/solidrun/imx8mq_hb/imx8mq_hb.c index 80f4202caef2..70ca8830b5be 100644 --- a/board/solidrun/imx8mq_hb/imx8mq_hb.c +++ b/board/solidrun/imx8mq_hb/imx8mq_hb.c @@ -306,5 +306,8 @@ int board_late_init(void) init_usb_clk(0); init_usb_clk(1); + imx8m_gpc_power(10, false); + imx8m_gpc_power(1, false); + return 0; }