mx6cuboxi: enable OF_CONTROL with DM_MMC and DM_USB

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>
This commit is contained in:
Baruch Siach 2019-11-10 14:38:07 +02:00 committed by Stefano Babic
parent 281d5e435b
commit eb9124f574
3 changed files with 89 additions and 52 deletions

View 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 = {

View 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

View File

@ -45,10 +45,7 @@
#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 */
@ -108,7 +105,8 @@
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) \