diff options
Diffstat (limited to 'board/freescale/imx8qxp_mek/imx8qxp_mek.c')
-rw-r--r-- | board/freescale/imx8qxp_mek/imx8qxp_mek.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/board/freescale/imx8qxp_mek/imx8qxp_mek.c b/board/freescale/imx8qxp_mek/imx8qxp_mek.c index c0641b3a20..13dc6a98e7 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; } |