summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2019-12-17 12:18:53 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2019-12-20 16:16:22 +0100
commit496b4132d8a0cfc04cbfaf3991111466ee308be1 (patch)
tree0dc7b3c231035640a2ab7accbc5362f189cef2e7 /arch
parent113645deeb0b16a14c6197d94e52c9247bd49de6 (diff)
downloadbarebox-496b4132d8a0cfc04cbfaf3991111466ee308be1.tar.gz
barebox-496b4132d8a0cfc04cbfaf3991111466ee308be1.tar.xz
ARM: zii-imx8mq-dev: add DT fixups
There are only two fixups we need to apply at the moment: - The 27" RMB3 based unit has a eGalax Touchscreen instead of Synaptics. - The 10.1" SCU/CCU unit has no DEB and thus no switch, but instead the i210 ethernet is routed to the external connector directly. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/boards/zii-imx8mq-dev/board.c138
-rw-r--r--arch/arm/dts/imx8mq-zii-ultra.dtsi10
2 files changed, 148 insertions, 0 deletions
diff --git a/arch/arm/boards/zii-imx8mq-dev/board.c b/arch/arm/boards/zii-imx8mq-dev/board.c
index dcf945db49..7326dcd2dc 100644
--- a/arch/arm/boards/zii-imx8mq-dev/board.c
+++ b/arch/arm/boards/zii-imx8mq-dev/board.c
@@ -11,6 +11,15 @@
#include <asm/memory.h>
#include <linux/sizes.h>
#include <mach/bbu.h>
+#include "../zii-common/pn-fixup.h"
+
+#define LRU_FLAG_EGALAX BIT(0)
+#define LRU_FLAG_NO_DEB BIT(1)
+
+struct zii_imx8mq_dev_lru_fixup {
+ struct zii_pn_fixup fixup;
+ unsigned int flags;
+};
static int zii_imx8mq_dev_init(void)
{
@@ -32,3 +41,132 @@ static int zii_imx8mq_dev_init(void)
return 0;
}
device_initcall(zii_imx8mq_dev_init);
+
+static int zii_imx8mq_dev_fixup_egalax_ts(struct device_node *root, void *ctx)
+{
+ struct device_node *np;
+
+ /*
+ * The 27" unit has a EETI eGalax touchscreen instead of the
+ * Synaptics RMI4 found on other units.
+ */
+ pr_info("Enabling eGalax touchscreen instead of RMI4\n");
+
+ np = of_find_compatible_node(root, NULL, "syna,rmi4-i2c");
+ if (!np)
+ return -ENODEV;
+
+ of_device_disable(np);
+
+ np = of_find_compatible_node(root, NULL, "eeti,exc3000");
+ if (!np)
+ return -ENODEV;
+
+ of_device_enable(np);
+
+ return 0;
+}
+
+static int zii_imx8mq_dev_fixup_deb_internal(void)
+{
+ struct device_node *np, *aliases;
+ struct device_d *dev;
+
+ /*
+ * In the internal DT remove the complete FEC hierarchy and move the
+ * i210 to be the eth0 interface to allow network boot to work without
+ * rewriting all the boot scripts.
+ */
+ aliases = of_find_node_by_path("/aliases");
+ if (!aliases)
+ return -ENODEV;
+
+ np = of_find_compatible_node(NULL, NULL, "fsl,imx8mq-fec");
+ if (!np)
+ return -ENODEV;
+
+ of_device_disable(np);
+
+ of_property_write_string(aliases, "ethernet1", np->full_name);
+
+ dev = of_find_device_by_node(np);
+ if (!dev)
+ return -ENODEV;
+
+ unregister_device(dev);
+
+ np = of_find_node_by_name(NULL, "i210@0");
+ if (!np)
+ return -ENODEV;
+
+ of_property_write_string(aliases, "ethernet0", np->full_name);
+
+ /* Refresh the internal aliases list from the patched DT */
+ of_alias_scan();
+
+ return 0;
+}
+
+static int zii_imx8mq_dev_fixup_deb(struct device_node *root, void *ctx)
+{
+ struct device_node *np;
+
+ /*
+ * In the kernel DT remove all devices from the DEB, which isn't
+ * present on this system.
+ */
+ np = of_find_compatible_node(root, NULL, "marvell,mv88e6085");
+ if (!np)
+ return -ENODEV;
+
+ of_device_disable(np);
+
+ np = of_find_compatible_node(root, NULL, "zii,rave-wdt");
+ if (!np)
+ return -ENODEV;
+
+ of_device_disable(np);
+
+ return 0;
+}
+
+static void zii_imx8mq_dev_lru_fixup(const struct zii_pn_fixup *context)
+{
+ const struct zii_imx8mq_dev_lru_fixup *fixup =
+ container_of(context, struct zii_imx8mq_dev_lru_fixup, fixup);
+
+ if (fixup->flags & LRU_FLAG_EGALAX)
+ of_register_fixup(zii_imx8mq_dev_fixup_egalax_ts, NULL);
+
+ if (fixup->flags & LRU_FLAG_NO_DEB) {
+ zii_imx8mq_dev_fixup_deb_internal();
+ of_register_fixup(zii_imx8mq_dev_fixup_deb, NULL);
+ }
+}
+
+#define ZII_IMX8MQ_DEV_LRU_FIXUP(__pn, __flags) \
+ { \
+ { __pn, zii_imx8mq_dev_lru_fixup }, \
+ __flags \
+ }
+
+static const struct zii_imx8mq_dev_lru_fixup zii_imx8mq_dev_lru_fixups[] = {
+ ZII_IMX8MQ_DEV_LRU_FIXUP("00-5131-02", LRU_FLAG_EGALAX),
+ ZII_IMX8MQ_DEV_LRU_FIXUP("00-5131-03", LRU_FLAG_EGALAX),
+ ZII_IMX8MQ_DEV_LRU_FIXUP("00-5170-01", LRU_FLAG_NO_DEB),
+};
+
+/*
+ * This initcall needs to be executed before coredevices, so we have a chance
+ * to fix up the devices with the correct information.
+ */
+static int zii_imx8mq_dev_process_fixups(void)
+{
+ if (!of_machine_is_compatible("zii,imx8mq-ultra"))
+ return 0;
+
+ zii_process_lru_fixups(zii_imx8mq_dev_lru_fixups);
+
+ return 0;
+}
+postmmu_initcall(zii_imx8mq_dev_process_fixups);
diff --git a/arch/arm/dts/imx8mq-zii-ultra.dtsi b/arch/arm/dts/imx8mq-zii-ultra.dtsi
index 6180f21ab0..50bad9b1a2 100644
--- a/arch/arm/dts/imx8mq-zii-ultra.dtsi
+++ b/arch/arm/dts/imx8mq-zii-ultra.dtsi
@@ -22,6 +22,11 @@
};
};
+ device-info {
+ nvmem-cells = <&lru_part_number>;
+ nvmem-cell-names = "lru-part-number";
+ };
+
aliases {
ethernet0 = &fec1;
ethernet1 = &i210;
@@ -64,6 +69,11 @@
&uart2 {
rave-sp {
eeprom@a4 {
+ lru_part_number: lru-part-number@21 {
+ reg = <0x21 15>;
+ read-only;
+ };
+
mac_address_0: mac-address@180 {
reg = <0x180 6>;
};