mx6cuboxi: enable OF_CONTROL with DM_MMC and DM_USB
authorBaruch Siach <baruch@tkos.co.il>
Sun, 10 Nov 2019 12:38:07 +0000 (14:38 +0200)
committerStefano Babic <sbabic@denx.de>
Tue, 7 Jan 2020 09:26:56 +0000 (10:26 +0100)
Make first step in DT/DM migration. Enable OF_CONTROL only for the main
U-Boot image for now.

Remove mmc_init_main() because board_mmc_init() is not called when
DM_MMC is enabled.

DM_MMC requires DM_GPIO for card-detect to work. That in turn makes gpio
request mandatory. Add code to request/free gpios in platform code.

MMC devices are now numbered according to DT. The SD card is 1, and eMMC
is 2. Account for that in board_mmc_get_env_dev(), BOOT_TARGET_DEVICES,
and has_emmc().

DM_MMC requires BLK. However, the (BLK && !DM_USB) combination disables
USB_STORAGE. Enable DM_USB to preserve USB functionality. Add also
DM_REGULATORS for the USB power controller. This allows us to drop
board_ehci_hcd_init() and setup_usb().

Runtime selection of DT is necessary because of the i.MX6QD vs i.MX6SDL
incompatibility. DT selection does not rely on GPIOs, since DM_GPIO
depends on DT. Instead, we take one "fully featured" DT of each variant.
That should be enough to boot from both SD card and eMMC.

Since we don't select the exact DT, override the generic
show_board_info() that shows the selected DT 'model' field.

Signed-off-by: Baruch Siach <baruch@tkos.co.il>
Reviewed-by: Fabio Estevam <festevam@gmail.com>
board/solidrun/mx6cuboxi/mx6cuboxi.c
configs/mx6cuboxi_defconfig
include/configs/mx6cuboxi.h

index d6e0c83e0d2178f7ecda402ccfb496c2573ec867..6a96f9ecdb5315a45577e5b966c4b1f0a9ecffdf 100644 (file)
@@ -66,6 +66,8 @@ enum board_type {
        UNKNOWN         = 0x03,
 };
 
+static struct gpio_desc board_detect_desc[5];
+
 #define MEM_STRIDE 0x4000000
 static u32 get_ram_size_stride_test(u32 *base, u32 maxsize)
 {
@@ -155,10 +157,6 @@ static iomux_v3_cfg_t const som_rev_detect[] = {
        IOMUX_PADS(PAD_CSI0_DAT18__GPIO6_IO04  | MUX_PAD_CTRL(UART_PAD_CTRL)),
 };
 
-static iomux_v3_cfg_t const usb_pads[] = {
-       IOMUX_PADS(PAD_GPIO_0__GPIO1_IO00 | MUX_PAD_CTRL(NO_PAD_CTRL)),
-};
-
 static void setup_iomux_uart(void)
 {
        SETUP_IOMUX_PADS(uart1_pads);
@@ -176,7 +174,7 @@ static struct fsl_esdhc_cfg emmc_cfg = {
 
 int board_mmc_get_env_dev(int devno)
 {
-       return devno - 1;
+       return devno;
 }
 
 #define USDHC2_CD_GPIO  IMX_GPIO_NR(1, 4)
@@ -198,27 +196,6 @@ int board_mmc_getcd(struct mmc *mmc)
        return ret;
 }
 
-static int mmc_init_main(bd_t *bis)
-{
-       int ret;
-
-       /*
-        * Following map is done:
-        * (U-Boot device node)    (Physical Port)
-        * mmc0                    Carrier board MicroSD
-        * mmc1                    SOM eMMC
-        */
-       SETUP_IOMUX_PADS(usdhc2_pads);
-       usdhc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
-       ret = fsl_esdhc_initialize(bis, &usdhc_cfg);
-       if (ret)
-               return ret;
-
-       SETUP_IOMUX_PADS(usdhc3_pads);
-       emmc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
-       return fsl_esdhc_initialize(bis, &emmc_cfg);
-}
-
 static int mmc_init_spl(bd_t *bis)
 {
        struct src *psrc = (struct src *)SRC_BASE_ADDR;
@@ -252,7 +229,7 @@ int board_mmc_init(bd_t *bis)
        if (IS_ENABLED(CONFIG_SPL_BUILD))
                return mmc_init_spl(bis);
 
-       return mmc_init_main(bis);
+       return 0;
 }
 
 static iomux_v3_cfg_t const enet_pads[] = {
@@ -284,12 +261,29 @@ static iomux_v3_cfg_t const enet_pads[] = {
 
 static void setup_iomux_enet(void)
 {
+       struct gpio_desc desc;
+       int ret;
+
        SETUP_IOMUX_PADS(enet_pads);
 
+       ret = dm_gpio_lookup_name("GPIO4_15", &desc);
+       if (ret) {
+               printf("%s: phy reset lookup failed\n", __func__);
+               return;
+       }
+
+       ret = dm_gpio_request(&desc, "phy-reset");
+       if (ret) {
+               printf("%s: phy reset request failed\n", __func__);
+               return;
+       }
+
        gpio_direction_output(ETH_PHY_RESET, 0);
        mdelay(10);
        gpio_set_value(ETH_PHY_RESET, 1);
        udelay(100);
+
+       gpio_free_list_nodev(&desc, 1);
 }
 
 int board_phy_config(struct phy_device *phydev)
@@ -434,21 +428,6 @@ static int setup_display(void)
 }
 #endif /* CONFIG_VIDEO_IPUV3 */
 
-#ifdef CONFIG_USB_EHCI_MX6
-static void setup_usb(void)
-{
-       SETUP_IOMUX_PADS(usb_pads);
-}
-
-int board_ehci_hcd_init(int port)
-{
-       if (port == 1)
-               gpio_direction_output(USB_H1_VBUS, 1);
-
-       return 0;
-}
-#endif
-
 int board_early_init_f(void)
 {
        setup_iomux_uart();
@@ -456,10 +435,6 @@ int board_early_init_f(void)
 #ifdef CONFIG_CMD_SATA
        setup_sata();
 #endif
-
-#ifdef CONFIG_USB_EHCI_MX6
-       setup_usb();
-#endif
        return 0;
 }
 
@@ -477,6 +452,29 @@ int board_init(void)
        return ret;
 }
 
+static int request_detect_gpios(void)
+{
+       int node;
+       int ret;
+
+       node = fdt_node_offset_by_compatible(gd->fdt_blob, 0,
+               "solidrun,hummingboard-detect");
+       if (node < 0)
+               return -ENODEV;
+
+       ret = gpio_request_list_by_name_nodev(offset_to_ofnode(node),
+               "detect-gpios", board_detect_desc,
+               ARRAY_SIZE(board_detect_desc), GPIOD_IS_IN);
+
+       return ret;
+}
+
+static int free_detect_gpios(void)
+{
+       return gpio_free_list_nodev(board_detect_desc,
+               ARRAY_SIZE(board_detect_desc));
+}
+
 static enum board_type board_type(void)
 {
        int val1, val2, val3;
@@ -532,7 +530,7 @@ static bool is_rev_15_som(void)
 static bool has_emmc(void)
 {
        struct mmc *mmc;
-       mmc = find_mmc_device(1);
+       mmc = find_mmc_device(2);
        if (!mmc)
                return 0;
        return (mmc_get_op_cond(mmc) < 0) ? 0 : 1;
@@ -540,6 +538,8 @@ static bool has_emmc(void)
 
 int checkboard(void)
 {
+       request_detect_gpios();
+
        switch (board_type()) {
        case CUBOXI:
                puts("Board: MX6 Cubox-i");
@@ -561,13 +561,22 @@ int checkboard(void)
        else
                puts("\n");
 
+       free_detect_gpios();
 out:
        return 0;
 }
 
+/* Override the default implementation, DT model is not accurate */
+int show_board_info(void)
+{
+       return checkboard();
+}
+
 int board_late_init(void)
 {
 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+       request_detect_gpios();
+
        switch (board_type()) {
        case CUBOXI:
                env_set("board_name", "CUBOXI");
@@ -594,11 +603,27 @@ int board_late_init(void)
        if (has_emmc())
                env_set("has_emmc", "yes");
 
+       free_detect_gpios();
 #endif
 
        return 0;
 }
 
+/*
+ * This is not a perfect match. Avoid dependency on the DM GPIO driver needed
+ * for accurate board detection. Hummingboard2 DT is good enough for U-Boot on
+ * all Hummingboard/Cubox-i platforms.
+ */
+int board_fit_config_name_match(const char *name)
+{
+       char tmp_name[36];
+
+       snprintf(tmp_name, sizeof(tmp_name), "%s-hummingboard2-emmc-som-v15",
+                       is_mx6dq() ? "imx6q" : "imx6dl");
+
+       return strcmp(name, tmp_name);
+}
+
 #ifdef CONFIG_SPL_BUILD
 #include <asm/arch/mx6-ddr.h>
 static const struct mx6dq_iomux_ddr_regs mx6q_ddr_ioregs = {
index 0692f31f0ae434f96e92ceeea5fd200dcfe00062..23ce485f43f894895d8d59f0210a814e420dbf2f 100644 (file)
@@ -14,8 +14,10 @@ CONFIG_SPL=y
 CONFIG_SPL_LIBDISK_SUPPORT=y
 # CONFIG_CMD_BMODE is not set
 CONFIG_CMD_HDMIDETECT=y
+CONFIG_AHCI=y
 CONFIG_SPL_TEXT_BASE=0x00908000
 CONFIG_DISTRO_DEFAULTS=y
+CONFIG_FIT=y
 CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/spl_sd.cfg"
 CONFIG_BOOTCOMMAND="run findfdt; run finduuid; run distro_bootcmd"
 CONFIG_USE_PREBOOT=y
@@ -27,23 +29,35 @@ CONFIG_SPL_I2C_SUPPORT=y
 CONFIG_SPL_WATCHDOG_SUPPORT=y
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_MMC=y
+# CONFIG_CMD_PINMUX is not set
 CONFIG_CMD_SATA=y
 CONFIG_CMD_USB=y
 CONFIG_CMD_CACHE=y
 CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_PARTITION_UUIDS is not set
+CONFIG_OF_CONTROL=y
+CONFIG_DEFAULT_DEVICE_TREE="imx6dl-hummingboard2-emmc-som-v15"
+CONFIG_OF_LIST="imx6dl-hummingboard2-emmc-som-v15 imx6q-hummingboard2-emmc-som-v15"
+CONFIG_MULTI_DTB_FIT=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
+CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM=y
 CONFIG_DWC_AHSATA=y
+CONFIG_DM_GPIO=y
+CONFIG_DM_MMC=y
 CONFIG_FSL_USDHC=y
 CONFIG_PHYLIB=y
 CONFIG_MII=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_IMX6=y
+CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
 CONFIG_DM_THERMAL=y
 CONFIG_USB=y
+CONFIG_DM_USB=y
 CONFIG_USB_KEYBOARD=y
 CONFIG_VIDEO_IPUV3=y
 CONFIG_VIDEO=y
 # CONFIG_VIDEO_SW_CURSOR is not set
-CONFIG_OF_LIBFDT=y
index c8d91dcfa05d6085cbb22c87ff584a88234bcbbd..6d47e28fc72b43dec058d4328be9ca56a6f1414f 100644 (file)
 #define CONFIG_IMX_VIDEO_SKIP
 
 /* USB */
-#define CONFIG_EHCI_HCD_INIT_AFTER_RESET
 #define CONFIG_MXC_USB_PORTSC          (PORT_PTS_UTMI | PORT_PTS_PTW)
-#define CONFIG_MXC_USB_FLAGS           0
-#define CONFIG_USB_MAX_CONTROLLER_COUNT        2
 
 /* Command definition */
 
        BOOTENV
 
 #define BOOT_TARGET_DEVICES(func) \
-       func(MMC, mmc, 0) \
+       func(MMC, mmc, 1) \
+       func(MMC, mmc, 2) \
        func(SATA, sata, 0) \
        func(USB, usb, 0) \
        func(PXE, pxe, na) \