From 7c3d2a17bf85e97a486d01e231480baaa7e7a167 Mon Sep 17 00:00:00 2001 From: Frank Li Date: Thu, 9 Aug 2018 10:30:02 -0500 Subject: [PATCH] MLK-19181-2: i.MX850: SPL enable usb support Enable DWC3 USB support at i.MX850D platform Signed-off-by: Frank Li --- arch/arm/mach-imx/imx8m/soc.c | 44 ++++++++++++++++++++++++++++++++++++++-- board/freescale/common/tcpc.h | 12 +++++++++++ board/freescale/imx8mq_evk/spl.c | 3 +++ 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-imx/imx8m/soc.c b/arch/arm/mach-imx/imx8m/soc.c index 1e3e84a..0d48801 100644 --- a/arch/arm/mach-imx/imx8m/soc.c +++ b/arch/arm/mach-imx/imx8m/soc.c @@ -410,17 +410,57 @@ int arch_misc_init(void) #define FSL_SIP_GPC 0xC2000000 #define FSL_SIP_CONFIG_GPC_PM_DOMAIN 0x03 + +#ifdef CONFIG_SPL_BUILD +static uint32_t gpc_pu_m_core_offset[11] = { + 0xc00, 0xc40, 0xc80, 0xcc0, + 0xdc0, 0xe00, 0xe40, 0xe80, + 0xec0, 0xf00, 0xf40, +}; + +#define PGC_PCR 0 + +void imx_gpc_set_m_core_pgc(unsigned int offset, bool pdn) +{ + uintptr_t val; + + val = readl(GPC_BASE_ADDR + offset); + val &= ~(0x1 << PGC_PCR); + + if(pdn) + val |= 0x1 << PGC_PCR; + writel(val, GPC_BASE_ADDR + offset); +} + +void imx8m_usb_power_domain(uint32_t domain_id, bool on) +{ + uint32_t val; + uintptr_t reg; + + imx_gpc_set_m_core_pgc(gpc_pu_m_core_offset[domain_id], true); + + reg = GPC_BASE_ADDR + (on ? 0xf8 : 0x104); + val = 1 << (domain_id > 3 ? (domain_id + 3) : domain_id); + writel(val, reg); + while (readl(reg) & val) + ; + imx_gpc_set_m_core_pgc(gpc_pu_m_core_offset[domain_id], false); +} +#endif + int imx8m_usb_power(int usb_id, bool on) { unsigned long ret; if (usb_id > 1) return -EINVAL; - +#ifdef CONFIG_SPL_BUILD + imx8m_usb_power_domain(2 + usb_id, on); +#else ret = call_imx_sip(FSL_SIP_GPC, FSL_SIP_CONFIG_GPC_PM_DOMAIN, 2 + usb_id, on, 0); if (ret) return -EPERM; - +#endif return 0; } diff --git a/board/freescale/common/tcpc.h b/board/freescale/common/tcpc.h index e1193c3..82fcdda 100644 --- a/board/freescale/common/tcpc.h +++ b/board/freescale/common/tcpc.h @@ -451,4 +451,16 @@ int tcpc_init(struct tcpc_port *port, struct tcpc_port_config config, ss_mux_sel bool tcpc_pd_sink_check_charging(struct tcpc_port *port); void tcpc_print_log(struct tcpc_port *port); +#ifdef CONFIG_SPL_BUILD +int tcpc_setup_ufp_mode(struct tcpc_port *port) +{ + return 0; +} +#endif +#ifdef CONFIG_SPL_BUILD +int tcpc_setup_dfp_mode(struct tcpc_port *port) +{ + return 0; +} +#endif #endif /* __TCPCI_H */ diff --git a/board/freescale/imx8mq_evk/spl.c b/board/freescale/imx8mq_evk/spl.c index a59d324..f7274e0 100644 --- a/board/freescale/imx8mq_evk/spl.c +++ b/board/freescale/imx8mq_evk/spl.c @@ -197,11 +197,14 @@ void spl_board_init(void) /* DDR initialization */ spl_dram_init(); +#ifndef CONFIG_SPL_USB_SDP_SUPPORT /* Serial download mode */ if (is_usb_boot()) { puts("Back to ROM, SDP\n"); restore_boot_params(); } +#endif + puts("Normal Boot\n"); } -- 1.9.1