arm: mx6: cm_fx6: add usb support
authorNikita Kiryanov <nikita@compulab.co.il>
Wed, 20 Aug 2014 12:09:03 +0000 (15:09 +0300)
committerStefano Babic <sbabic@denx.de>
Tue, 9 Sep 2014 13:37:08 +0000 (15:37 +0200)
Add USB and USB OTG host support for Compulab CM-FX6 CoM.

Cc: Igor Grinberg <grinberg@compulab.co.il>
Cc: Stefano Babic <sbabic@denx.de>
Cc: Tom Rini <trini@ti.com>
Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il>
board/compulab/cm_fx6/cm_fx6.c
board/compulab/cm_fx6/common.h
include/configs/cm_fx6.h

index 681b1ee..26f0417 100644 (file)
 #include <fdt_support.h>
 #include <asm/arch/crm_regs.h>
 #include <asm/arch/sys_proto.h>
+#include <asm/arch/iomux.h>
 #include <asm/io.h>
 #include <asm/gpio.h>
 #include "common.h"
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#ifdef CONFIG_USB_EHCI_MX6
+#define WEAK_PULLDOWN  (PAD_CTL_PUS_100K_DOWN |                \
+                       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | \
+                       PAD_CTL_HYS | PAD_CTL_SRE_SLOW)
+
+static int cm_fx6_usb_hub_reset(void)
+{
+       int err;
+
+       err = gpio_request(CM_FX6_USB_HUB_RST, "usb hub rst");
+       if (err) {
+               printf("USB hub rst gpio request failed: %d\n", err);
+               return -1;
+       }
+
+       SETUP_IOMUX_PAD(PAD_SD3_RST__GPIO7_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL));
+       gpio_direction_output(CM_FX6_USB_HUB_RST, 0);
+       udelay(10);
+       gpio_direction_output(CM_FX6_USB_HUB_RST, 1);
+       mdelay(1);
+
+       return 0;
+}
+
+static int cm_fx6_init_usb_otg(void)
+{
+       int ret;
+       struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
+
+       ret = gpio_request(SB_FX6_USB_OTG_PWR, "usb-pwr");
+       if (ret) {
+               printf("USB OTG pwr gpio request failed: %d\n", ret);
+               return ret;
+       }
+
+       SETUP_IOMUX_PAD(PAD_EIM_D22__GPIO3_IO22 | MUX_PAD_CTRL(NO_PAD_CTRL));
+       SETUP_IOMUX_PAD(PAD_ENET_RX_ER__USB_OTG_ID |
+                                               MUX_PAD_CTRL(WEAK_PULLDOWN));
+       clrbits_le32(&iomux->gpr[1], IOMUXC_GPR1_OTG_ID_MASK);
+       /* disable ext. charger detect, or it'll affect signal quality at dp. */
+       return gpio_direction_output(SB_FX6_USB_OTG_PWR, 0);
+}
+
+#define MX6_USBNC_BASEADDR     0x2184800
+#define USBNC_USB_H1_PWR_POL   (1 << 9)
+int board_ehci_hcd_init(int port)
+{
+       u32 *usbnc_usb_uh1_ctrl = (u32 *)(MX6_USBNC_BASEADDR + 4);
+
+       switch (port) {
+       case 0:
+               return cm_fx6_init_usb_otg();
+       case 1:
+               SETUP_IOMUX_PAD(PAD_GPIO_0__USB_H1_PWR |
+                               MUX_PAD_CTRL(NO_PAD_CTRL));
+
+               /* Set PWR polarity to match power switch's enable polarity */
+               setbits_le32(usbnc_usb_uh1_ctrl, USBNC_USB_H1_PWR_POL);
+               return cm_fx6_usb_hub_reset();
+       default:
+               break;
+       }
+
+       return 0;
+}
+
+int board_ehci_power(int port, int on)
+{
+       if (port == 0)
+               return gpio_direction_output(SB_FX6_USB_OTG_PWR, on);
+
+       return 0;
+}
+#endif
+
 #ifdef CONFIG_FEC_MXC
 #define ENET_PAD_CTRL          (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
                                 PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
index 1b19f16..f841c90 100644 (file)
@@ -16,6 +16,9 @@
 #define CM_FX6_ECSPI_BUS0_CS0  IMX_GPIO_NR(2, 30)
 #define CM_FX6_GREEN_LED       IMX_GPIO_NR(2, 31)
 #define CM_FX6_ENET_NRST       IMX_GPIO_NR(2, 8)
+#define CM_FX6_ENET_NRST       IMX_GPIO_NR(2, 8)
+#define CM_FX6_USB_HUB_RST     IMX_GPIO_NR(7, 8)
+#define SB_FX6_USB_OTG_PWR     IMX_GPIO_NR(3, 22)
 
 void cm_fx6_set_usdhc_iomux(void);
 void cm_fx6_set_ecspi_iomux(void);
index 22b3376..0c25dda 100644 (file)
 #define CONFIG_NETMASK                 255.255.255.0
 #define CONFIG_NET_RETRY_COUNT         5
 
+/* USB */
+#define CONFIG_CMD_USB
+#define CONFIG_USB_EHCI
+#define CONFIG_USB_EHCI_MX6
+#define CONFIG_USB_STORAGE
+#define CONFIG_MXC_USB_PORTSC          (PORT_PTS_UTMI | PORT_PTS_PTW)
+#define CONFIG_MXC_USB_FLAGS           0
+#define CONFIG_USB_MAX_CONTROLLER_COUNT        2
+#define CONFIG_EHCI_HCD_INIT_AFTER_RESET       /* For OTG port */
+
 /* GPIO */
 #define CONFIG_MXC_GPIO