diff --git a/arch/arm/dts/fsl-imx8qxp-mek.dts b/arch/arm/dts/fsl-imx8qxp-mek.dts index edc201c933860420ebef7f25676789274cfea4fc..8f1f483d44373dec4ee6ee9c9f0b6b6435c652f6 100644 --- a/arch/arm/dts/fsl-imx8qxp-mek.dts +++ b/arch/arm/dts/fsl-imx8qxp-mek.dts @@ -403,3 +403,7 @@ vmmc-supply = <®_usdhc2_vmmc>; status = "okay"; }; + +&usb2 { + status = "okay"; +}; diff --git a/board/freescale/imx8qxp_mek/imx8qxp_mek.c b/board/freescale/imx8qxp_mek/imx8qxp_mek.c index c0641b3a20f895a682e4391006dcf549819940dd..13dc6a98e74a7fc3c6d311be62b370a97ac4d242 100644 --- a/board/freescale/imx8qxp_mek/imx8qxp_mek.c +++ b/board/freescale/imx8qxp_mek/imx8qxp_mek.c @@ -28,6 +28,7 @@ #include <asm/imx-common/video.h> #include <asm/arch/video_common.h> #include <power-domain.h> +#include "../common/tcpc.h" DECLARE_GLOBAL_DATA_PTR; @@ -340,6 +341,7 @@ static int setup_fec(int ind) static iomux_cfg_t board_gpios[] = { SC_P_SPI2_SDO | MUX_MODE_ALT(4) | MUX_PAD_CTRL(GPIO_PAD_CTRL), + SC_P_ENET0_REFCLK_125M_25M | MUX_MODE_ALT(4) | MUX_PAD_CTRL(GPIO_PAD_CTRL), }; static void board_gpio_init(void) @@ -421,6 +423,86 @@ static void setup_otg(void) } #endif +#ifdef CONFIG_USB_XHCI_IMX8 + +#define USB_TYPEC_SEL IMX_GPIO_NR(5, 9) +static iomux_cfg_t ss_mux_gpio[] = { + SC_P_ENET0_REFCLK_125M_25M | MUX_MODE_ALT(4) | MUX_PAD_CTRL(GPIO_PAD_CTRL), +}; + +struct udevice *tcpc_i2c_dev = NULL; + +static void setup_typec(void) +{ + struct udevice *bus; + uint8_t chip = 0x50; + int ret; + struct gpio_desc typec_en_desc; + + imx8_iomux_setup_multiple_pads(ss_mux_gpio, ARRAY_SIZE(ss_mux_gpio)); + gpio_request(USB_TYPEC_SEL, "typec_sel"); + + ret = dm_gpio_lookup_name("gpio@1a_7", &typec_en_desc); + if (ret) { + printf("%s lookup gpio@1a_7 failed ret = %d\n", __func__, ret); + return; + } + + ret = dm_gpio_request(&typec_en_desc, "typec_en"); + if (ret) { + printf("%s request typec_en failed ret = %d\n", __func__, ret); + return; + } + + /* Enable SS MUX */ + dm_gpio_set_dir_flags(&typec_en_desc, GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE); + + ret = uclass_get_device_by_seq(UCLASS_I2C, 1, &bus); + if (ret) { + printf("%s: Can't find bus\n", __func__); + return; + } + + ret = dm_i2c_probe(bus, chip, 0, &tcpc_i2c_dev); + if (ret) { + printf("%s: Can't find device id=0x%x\n", + __func__, chip); + return; + } + + tcpc_init(tcpc_i2c_dev); +} + +void ss_mux_select(enum typec_cc_polarity pol) +{ + if (pol == TYPEC_POLARITY_CC1) + gpio_direction_output(USB_TYPEC_SEL, 0); + else + gpio_direction_output(USB_TYPEC_SEL, 1); +} + +int board_usb_init(int index, enum usb_init_type init) +{ + int ret = 0; + + if (init == USB_INIT_HOST && tcpc_i2c_dev) + ret = tcpc_setup_dfp_mode(tcpc_i2c_dev, &ss_mux_select); + + return ret; + +} + +int board_usb_cleanup(int index, enum usb_init_type init) +{ + int ret = 0; + + if (init == USB_INIT_HOST && tcpc_i2c_dev) + ret = tcpc_disable_vbus(tcpc_i2c_dev); + + return ret; +} +#endif + int board_init(void) { #ifdef CONFIG_MXC_GPIO @@ -435,6 +517,10 @@ int board_init(void) setup_otg(); #endif +#ifdef CONFIG_USB_XHCI_IMX8 + setup_typec(); +#endif + return 0; } diff --git a/configs/imx8qxp_mek_defconfig b/configs/imx8qxp_mek_defconfig index 0cdbe607c93836b0fcf305d082e49819ef19a8d3..9a4f8087bfd9bf7a6f58396188d47ce09a7977e6 100644 --- a/configs/imx8qxp_mek_defconfig +++ b/configs/imx8qxp_mek_defconfig @@ -17,11 +17,15 @@ CONFIG_CMD_I2C=y CONFIG_I2C_MUX=y CONFIG_I2C_MUX_PCA954x=y -# CONFIG_CMD_USB=y -# CONFIG_USB=y -# CONFIG_DM_USB=y -# CONFIG_USB_EHCI_HCD=y -# CONFIG_USB_STORAGE=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_IMX8=y + +CONFIG_DM_USB=y + +CONFIG_CMD_USB=y +CONFIG_USB=y +CONFIG_USB_STORAGE=y + # CONFIG_CMD_USB_MASS_STORAGE=y # CONFIG_USB_GADGET=y diff --git a/include/configs/imx8qxp_mek.h b/include/configs/imx8qxp_mek.h index 3c91400f119015c28864d368fee5da796e4d5e0d..a00a2f15e79d3a2800e2c99a9096a164b26fdc57 100644 --- a/include/configs/imx8qxp_mek.h +++ b/include/configs/imx8qxp_mek.h @@ -259,12 +259,22 @@ #include "imx8qxp_mek_android.h" #endif -/* USB OTG controller configs */ +/* USB Config */ #ifdef CONFIG_CMD_USB +#define CONFIG_USB_MAX_CONTROLLER_COUNT 2 + +/* USB 3.0 controller configs */ +#ifdef CONFIG_USB_XHCI_IMX8 +#define CONFIG_SYS_USB_XHCI_MAX_ROOT_PORTS 2 +#endif + +/* USB OTG controller configs */ +#ifdef CONFIG_USB_EHCI_HCD #define CONFIG_USB_HOST_ETHER #define CONFIG_USB_ETHER_ASIX #define CONFIG_MXC_USB_PORTSC (PORT_PTS_UTMI | PORT_PTS_PTW) #endif +#endif /* CONFIG_CMD_USB */ #ifdef CONFIG_USB_GADGET #define CONFIG_USBD_HS