Explicitly set USB Switch (PTN5150A) to UFP
* The default configuration (via resistor stuffing) is DFP (host). This
means that on Type-C hosts fastboot won't work.
* Set to UFP to ensure fastboot works properly.
Change-Id: I2b63d95e08df70da43dee1f8f7bb59d1863943f4
diff --git a/board/freescale/imx8mq_phanbell/imx8m_phanbell.c b/board/freescale/imx8mq_phanbell/imx8m_phanbell.c
index 1689bbb..b066ed2 100644
--- a/board/freescale/imx8mq_phanbell/imx8m_phanbell.c
+++ b/board/freescale/imx8mq_phanbell/imx8m_phanbell.c
@@ -11,10 +11,12 @@
#include <asm/io.h>
#include <miiphy.h>
#include <netdev.h>
+#include <dm.h>
#include <asm/imx-common/iomux-v3.h>
#include <asm/imx-common/boot_mode.h>
#include <asm-generic/gpio.h>
#include <fsl_esdhc.h>
+#include <i2c.h>
#include <mmc.h>
#include <asm/arch/imx8mq_pins.h>
#include <asm/arch/sys_proto.h>
@@ -164,6 +166,12 @@
#define USB_PHY_CTRL2 0xF0048
#define USB_PHY_CTRL2_TXENABLEN0 BIT(8)
+#define PTN5150A_BUS 2
+#define PTN5150A_ADDR 0x3D
+#define PTN5150A_CONTROL 0x2
+#define PTN5150A_CONTROL_PORT_MASK 0x6
+
+
static struct dwc3_device dwc3_device_data = {
.maximum_speed = USB_SPEED_HIGH,
.base = USB1_BASE_ADDR,
@@ -200,6 +208,37 @@
RegData &= ~(USB_PHY_CTRL1_RESET | USB_PHY_CTRL1_ATERESET);
writel(RegData, dwc3->base + USB_PHY_CTRL1);
}
+
+static void configure_cc_switch() {
+ uint8_t value;
+ int ret;
+ struct udevice *bus, *dev;
+
+ ret = uclass_get_device_by_seq(UCLASS_I2C, PTN5150A_BUS, &bus);
+ if (ret) {
+ printf("%s: No bus %d\n", __func__, PTN5150A_BUS);
+ return;
+ }
+
+ ret = dm_i2c_probe(bus, PTN5150A_ADDR, 0, &dev);
+ if (ret) {
+ printf("%s: Can't find device id=0x%x, on bus %d\n",
+ __func__, PTN5150A_ADDR, PTN5150A_BUS);
+ return;
+ }
+
+ if (dm_i2c_read(dev, PTN5150A_CONTROL, &value, 1)) {
+ printf("Unable to configure USB switch");
+ return;
+ }
+
+ value &= ~PTN5150A_CONTROL_PORT_MASK;
+ if (dm_i2c_write(dev, PTN5150A_CONTROL, &value, 1)) {
+ printf("Unable to configure USB switch");
+ return;
+ }
+ printf("Configured USB Switch for UFP\n");
+}
#endif
#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_IMX8M)
@@ -207,6 +246,10 @@
{
imx8m_usb_power(index, true);
+ /* Explicitly set USB switch to UFP (device) to ensure proper
+ * fastboot operation on type-C ports. */
+ configure_cc_switch();
+
if (index == 0 && init == USB_INIT_DEVICE) {
dwc3_nxp_usb_phy_init(&dwc3_device_data);
return dwc3_uboot_init(&dwc3_device_data);