x86: dfi-bt700: Add xHCI USB support
authorStefan Roese <sr@denx.de>
Tue, 18 Jul 2017 12:10:49 +0000 (14:10 +0200)
committerBin Meng <bmeng.cn@gmail.com>
Sun, 30 Jul 2017 02:30:25 +0000 (10:30 +0800)
Change from EHCI to xHCI on the DFI BayTrail SoM.

The xHCI USB hub is connected to an GPIO on the DFI BayTrail SoM. For
correct operation, it needs to get reset upon power-up. Otherwise it
may happen that the hub is not detected after a software reboot. This
patch also configures this GPIO in the dts for correct operation.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/dts/dfi-bt700.dtsi
board/dfi/dfi-bt700/Kconfig
board/dfi/dfi-bt700/dfi-bt700.c

index 04aa95a..b62e00f 100644 (file)
                        pad-offset = <0x3a0>;
                        mode-func = <1>;
                };
+
+               xhci_hub_reset: usb_ulpi_stp@0 {
+                       gpio-offset = <0xa0 10>;
+                       pad-offset = <0x23b0>;
+                       mode-func = <0>;
+                       mode-gpio;
+                       output-value = <1>;
+                       direction = <PIN_OUTPUT>;
+               };
        };
 
        chosen {
                fsp,enable-spi;
                fsp,enable-sata;
                fsp,sata-mode = <SATA_MODE_AHCI>;
+#ifdef CONFIG_USB_XHCI_HCD
+               fsp,enable-xhci;
+#endif
                fsp,lpe-mode = <LPE_MODE_PCI>;
                fsp,lpss-sio-mode = <LPSS_SIO_MODE_PCI>;
                fsp,enable-dma0;
index 3f0acb3..fca8b53 100644 (file)
@@ -21,6 +21,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
        select X86_RESET_VECTOR if !EFI_STUB
        select INTEL_BAYTRAIL
        select BOARD_ROMSIZE_KB_8192
+       select BOARD_LATE_INIT
 
 config PCIE_ECAM_BASE
        default 0xe0000000
index 8645bdc..3dd2036 100644 (file)
@@ -28,3 +28,30 @@ int board_early_init_f(void)
 
        return 0;
 }
+
+int board_late_init(void)
+{
+       struct gpio_desc desc;
+       int ret;
+
+       ret = dm_gpio_lookup_name("F10", &desc);
+       if (ret)
+               debug("gpio ret=%d\n", ret);
+       ret = dm_gpio_request(&desc, "xhci_hub_reset");
+       if (ret)
+               debug("gpio_request ret=%d\n", ret);
+       ret = dm_gpio_set_dir_flags(&desc, GPIOD_IS_OUT);
+       if (ret)
+               debug("gpio dir ret=%d\n", ret);
+
+       /* Pull xHCI hub reset to low (active low) */
+       dm_gpio_set_value(&desc, 0);
+
+       /* Wait at least 5 ms, so lets choose 10 to be safe */
+       mdelay(10);
+
+       /* Pull xHCI hub reset to high (active low) */
+       dm_gpio_set_value(&desc, 1);
+
+       return 0;
+}