summaryrefslogtreecommitdiffstats
path: root/arch/arm/boards/phytec-som-imx6/board.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/boards/phytec-som-imx6/board.c')
-rw-r--r--arch/arm/boards/phytec-som-imx6/board.c207
1 files changed, 152 insertions, 55 deletions
diff --git a/arch/arm/boards/phytec-som-imx6/board.c b/arch/arm/boards/phytec-som-imx6/board.c
index 27a1ad4f66..2db3fa1db8 100644
--- a/arch/arm/boards/phytec-som-imx6/board.c
+++ b/arch/arm/boards/phytec-som-imx6/board.c
@@ -1,23 +1,9 @@
-/*
- * Copyright (C) 2013 Sascha Hauer, Pengutronix
- * Copyright (C) 2015 PHYTEC Messtechnik GmbH,
- * Author: Stefan Christ <s.christ@phytec.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation.
- *
- */
+// SPDX-License-Identifier: GPL-2.0-or-later
+// SPDX-FileCopyrightText: 2013 Sascha Hauer, Pengutronix
+// SPDX-FileCopyrightText: 2015 PHYTEC Messtechnik GmbH
+
+/* Author: Stefan Christ <s.christ@phytec.de> */
+
#define pr_fmt(fmt) "phySOM-i.MX6: " fmt
#include <malloc.h>
@@ -28,16 +14,17 @@
#include <gpio.h>
#include <init.h>
#include <of.h>
+#include <deep-probe.h>
#include <i2c/i2c.h>
-#include <mach/bbu.h>
+#include <mach/imx/bbu.h>
#include <platform_data/eth-fec.h>
#include <mfd/imx6q-iomuxc-gpr.h>
#include <linux/micrel_phy.h>
#include <globalvar.h>
-#include <mach/iomux-mx6.h>
-#include <mach/imx6.h>
+#include <mach/imx/iomux-mx6.h>
+#include <mach/imx/imx6.h>
#define PHYFLEX_MODULE_REV_1 0x1
#define PHYFLEX_MODULE_REV_2 0x2
@@ -120,10 +107,14 @@ static int phycore_da9062_setup_buck_mode(void)
unsigned char value;
int ret;
- pmic_np = of_find_node_by_name(NULL, "pmic@58");
+ pmic_np = of_find_node_by_name_address(NULL, "pmic@58");
if (!pmic_np)
return -ENODEV;
+ ret = of_device_ensure_probed(pmic_np);
+ if (ret)
+ return ret;
+
adapter = of_find_i2c_adapter_by_node(pmic_np->parent);
if (!adapter)
return -ENODEV;
@@ -155,15 +146,29 @@ err_out:
return ret;
}
-static int physom_imx6_devices_init(void)
+#define IS_PHYFLEX BIT(0)
+#define IS_PHYCORE BIT(1)
+#define IS_PHYCARD BIT(2)
+#define IS_PHYCORE_UL BIT(3)
+#define HAS_MMC3 BIT(4)
+#define HAS_MMC1 BIT(5)
+
+struct board_data {
+ unsigned flags;
+};
+
+static int physom_imx6_probe(struct device *dev)
{
int ret;
char *environment_path, *default_environment_path;
char *envdev, *default_envdev;
+ const struct board_data *brd = device_get_match_data(dev);
+ unsigned flags = brd->flags;
- if (of_machine_is_compatible("phytec,imx6q-pfla02")
- || of_machine_is_compatible("phytec,imx6dl-pfla02")
- || of_machine_is_compatible("phytec,imx6s-pfla02")) {
+ if (flags & IS_PHYFLEX) {
+ ret = of_devices_ensure_probed_by_property("gpio-controller");
+ if (ret)
+ return ret;
phyflex_err006282_workaround();
@@ -175,18 +180,17 @@ static int physom_imx6_devices_init(void)
default_environment_path = "/chosen/environment-spinor";
default_envdev = "SPI NOR flash";
- } else if (of_machine_is_compatible("phytec,imx6q-pcaaxl3")) {
+ imx6_bbu_internal_mmc_register_handler("mmc2",
+ "/dev/mmc2", 0);
+ } else if (flags & IS_PHYCARD) {
barebox_set_hostname("phyCARD-i.MX6");
default_environment_path = "/chosen/environment-nand";
default_envdev = "NAND flash";
- } else if (of_machine_is_compatible("phytec,imx6q-pcm058-nand")
- || of_machine_is_compatible("phytec,imx6q-pcm058-emmc")
- || of_machine_is_compatible("phytec,imx6dl-pcm058-nand")
- || of_machine_is_compatible("phytec,imx6qp-pcm058-nand")
- || of_machine_is_compatible("phytec,imx6dl-pcm058-emmc")) {
-
+ imx6_bbu_internal_mmc_register_handler("mmc2",
+ "/dev/mmc2", 0);
+ } else if (flags & IS_PHYCORE) {
if (phycore_da9062_setup_buck_mode())
pr_err("Setting PMIC BUCK mode failed\n");
@@ -194,8 +198,10 @@ static int physom_imx6_devices_init(void)
default_environment_path = "/chosen/environment-spinor";
default_envdev = "SPI NOR flash";
- } else if (of_machine_is_compatible("phytec,imx6ul-pcl063-nand")
- || of_machine_is_compatible("phytec,imx6ul-pcl063-emmc")) {
+ imx6_bbu_internal_mmc_register_handler("mmc0",
+ "/dev/mmc0", 0);
+
+ } else if (flags & IS_PHYCORE_UL) {
barebox_set_hostname("phyCORE-i.MX6UL");
default_environment_path = "/chosen/environment-nand";
default_envdev = "NAND flash";
@@ -203,8 +209,12 @@ static int physom_imx6_devices_init(void)
phy_register_fixup_for_uid(PHY_ID_KSZ8081, MICREL_PHY_ID_MASK,
ksz8081_phy_fixup);
- } else
- return 0;
+ imx6_bbu_internal_mmc_register_handler("mmc0",
+ "/dev/mmc0", 0);
+
+ } else {
+ return -EINVAL;
+ }
switch (bootsource_get()) {
case BOOTSOURCE_MMC:
@@ -221,7 +231,7 @@ static int physom_imx6_devices_init(void)
envdev = "SPI NOR flash";
break;
default:
- environment_path = basprintf(default_environment_path);
+ environment_path = strdup(default_environment_path);
envdev = default_envdev;
break;
}
@@ -236,15 +246,18 @@ static int physom_imx6_devices_init(void)
pr_notice("Using environment in %s\n", envdev);
- if (of_machine_is_compatible("phytec,imx6q-pcm058-emmc")
- || of_machine_is_compatible("phytec,imx6dl-pcm058-emmc")) {
+ if (flags & HAS_MMC3) {
imx6_bbu_internal_mmc_register_handler("mmc3",
"/dev/mmc3",
BBU_HANDLER_FLAG_DEFAULT);
- } else if (of_machine_is_compatible("phytec,imx6ul-pcl063-emmc")) {
+ imx6_bbu_internal_mmcboot_register_handler("mmc3-boot",
+ "mmc3", 0);
+ } else if (flags & HAS_MMC1) {
imx6_bbu_internal_mmc_register_handler("mmc1",
"/dev/mmc1",
BBU_HANDLER_FLAG_DEFAULT);
+ imx6_bbu_internal_mmcboot_register_handler("mmc1-boot",
+ "mmc1", 0);
} else {
imx6_bbu_nand_register_handler("nand", BBU_HANDLER_FLAG_DEFAULT);
}
@@ -252,23 +265,107 @@ static int physom_imx6_devices_init(void)
defaultenv_append_directory(defaultenv_physom_imx6);
/* Overwrite file /env/init/automount */
- if (of_machine_is_compatible("phytec,imx6q-pfla02")
- || of_machine_is_compatible("phytec,imx6dl-pfla02")
- || of_machine_is_compatible("phytec,imx6s-pfla02")
- || of_machine_is_compatible("phytec,imx6q-pcaaxl3")) {
+ if (flags & IS_PHYCARD || flags & IS_PHYFLEX) {
defaultenv_append_directory(defaultenv_physom_imx6);
- } else if (of_machine_is_compatible("phytec,imx6qp-pcm058-nand")
- || of_machine_is_compatible("phytec,imx6q-pcm058-nand")
- || of_machine_is_compatible("phytec,imx6q-pcm058-emmc")
- || of_machine_is_compatible("phytec,imx6dl-pcm058-nand")
- || of_machine_is_compatible("phytec,imx6dl-pcm058-emmc")) {
+ } else if (flags & IS_PHYCORE) {
defaultenv_append_directory(defaultenv_physom_imx6);
defaultenv_append_directory(defaultenv_physom_imx6_phycore);
- } else if (of_machine_is_compatible("phytec,imx6ul-pcl063-nand")
- || of_machine_is_compatible("phytec,imx6ul-pcl063-emmc")) {
+ } else if (flags & IS_PHYCORE_UL) {
defaultenv_append_directory(defaultenv_physom_imx6ul_phycore);
}
return 0;
}
-device_initcall(physom_imx6_devices_init);
+
+static struct board_data imx6q_pfla02 = {
+ .flags = IS_PHYFLEX,
+};
+
+static struct board_data imx6dl_pfla02 = {
+ .flags = IS_PHYFLEX,
+};
+
+static struct board_data imx6s_pfla02 = {
+ .flags = IS_PHYFLEX,
+};
+
+static struct board_data imx6q_pcaaxl3 = {
+ .flags = IS_PHYCARD,
+};
+
+static struct board_data imx6q_pcm058_nand = {
+ .flags = IS_PHYCORE,
+};
+
+static struct board_data imx6q_pcm058_emmc = {
+ .flags = IS_PHYCORE | HAS_MMC3,
+};
+
+static struct board_data imx6dl_pcm058_nand = {
+ .flags = IS_PHYCORE,
+};
+
+static struct board_data imx6qp_pcm058_nand = {
+ .flags = IS_PHYCORE,
+};
+
+static struct board_data imx6dl_pcm058_emmc = {
+ .flags = IS_PHYCORE | HAS_MMC3,
+};
+
+static struct board_data imx6ul_pcl063_nand = {
+ .flags = IS_PHYCORE_UL,
+};
+
+static struct board_data imx6ul_pcl063_emmc = {
+ .flags = IS_PHYCORE_UL | HAS_MMC1,
+};
+
+
+static const struct of_device_id physom_imx6_match[] = {
+ {
+ .compatible = "phytec,imx6q-pfla02",
+ .data = &imx6q_pfla02,
+ }, {
+ .compatible = "phytec,imx6dl-pfla02",
+ .data = &imx6dl_pfla02,
+ }, {
+ .compatible = "phytec,imx6s-pfla02",
+ .data = &imx6s_pfla02,
+ }, {
+ .compatible = "phytec,imx6q-pcaaxl3",
+ .data = &imx6q_pcaaxl3,
+ }, {
+ .compatible = "phytec,imx6q-pcm058-nand",
+ .data = &imx6q_pcm058_nand,
+ }, {
+ .compatible = "phytec,imx6q-pcm058-emmc",
+ .data = &imx6q_pcm058_emmc,
+ }, {
+ .compatible = "phytec,imx6dl-pcm058-nand",
+ .data = &imx6dl_pcm058_nand,
+ }, {
+ .compatible = "phytec,imx6qp-pcm058-nand",
+ .data = &imx6qp_pcm058_nand,
+ }, {
+ .compatible = "phytec,imx6dl-pcm058-emmc",
+ .data = &imx6dl_pcm058_emmc,
+ }, {
+ .compatible = "phytec,imx6ul-pcl063-nand",
+ .data = &imx6ul_pcl063_nand,
+ }, {
+ .compatible = "phytec,imx6ul-pcl063-emmc",
+ .data = &imx6ul_pcl063_emmc,
+ },
+ { /* Sentinel */ },
+};
+
+static struct driver physom_imx6_driver = {
+ .name = "physom-imx6",
+ .probe = physom_imx6_probe,
+ .of_compatible = physom_imx6_match,
+};
+
+postcore_platform_driver(physom_imx6_driver);
+
+BAREBOX_DEEP_PROBE_ENABLE(physom_imx6_match);