mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 1/6] ARM: add Zii common directory and move switch reset command
@ 2019-03-13 10:56 Lucas Stach
  2019-03-13 10:56 ` [PATCH 2/6] ARM: zii-common: add support for switch reset on RDU1 Lucas Stach
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Lucas Stach @ 2019-03-13 10:56 UTC (permalink / raw)
  To: barebox; +Cc: Andrey Smirnov, Chris Healy

The Zii boards share some functionality across different boards. Add
a common directory, so we can implement this once and use across
different boards.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
 arch/arm/boards/Makefile                                    | 1 +
 arch/arm/boards/zii-common/Makefile                         | 1 +
 arch/arm/boards/{zii-imx6q-rdu2 => zii-common}/switch-cmd.c | 0
 arch/arm/boards/zii-imx6q-rdu2/Makefile                     | 2 +-
 arch/arm/mach-imx/Kconfig                                   | 4 ++++
 5 files changed, 7 insertions(+), 1 deletion(-)
 create mode 100644 arch/arm/boards/zii-common/Makefile
 rename arch/arm/boards/{zii-imx6q-rdu2 => zii-common}/switch-cmd.c (100%)

diff --git a/arch/arm/boards/Makefile b/arch/arm/boards/Makefile
index c5dc41526b23..fc883e3dea03 100644
--- a/arch/arm/boards/Makefile
+++ b/arch/arm/boards/Makefile
@@ -156,6 +156,7 @@ obj-$(CONFIG_MACH_QEMU_VIRT64)			+= qemu-virt64/
 obj-$(CONFIG_MACH_WARP7)			+= element14-warp7/
 obj-$(CONFIG_MACH_VF610_TWR)			+= freescale-vf610-twr/
 obj-$(CONFIG_MACH_XILINX_ZCU104)		+= xilinx-zcu104/
+obj-$(CONFIG_MACH_ZII_COMMON)			+= zii-common/
 obj-$(CONFIG_MACH_ZII_RDU1)			+= zii-imx51-rdu1/
 obj-$(CONFIG_MACH_ZII_RDU2)			+= zii-imx6q-rdu2/
 obj-$(CONFIG_MACH_ZII_IMX8MQ_DEV)		+= zii-imx8mq-dev/
diff --git a/arch/arm/boards/zii-common/Makefile b/arch/arm/boards/zii-common/Makefile
new file mode 100644
index 000000000000..9decfe85fc13
--- /dev/null
+++ b/arch/arm/boards/zii-common/Makefile
@@ -0,0 +1 @@
+obj-y += switch-cmd.o
diff --git a/arch/arm/boards/zii-imx6q-rdu2/switch-cmd.c b/arch/arm/boards/zii-common/switch-cmd.c
similarity index 100%
rename from arch/arm/boards/zii-imx6q-rdu2/switch-cmd.c
rename to arch/arm/boards/zii-common/switch-cmd.c
diff --git a/arch/arm/boards/zii-imx6q-rdu2/Makefile b/arch/arm/boards/zii-imx6q-rdu2/Makefile
index 10dfba3a3cf3..c6285362f2ee 100644
--- a/arch/arm/boards/zii-imx6q-rdu2/Makefile
+++ b/arch/arm/boards/zii-imx6q-rdu2/Makefile
@@ -1,3 +1,3 @@
-obj-y += board.o switch-cmd.o
+obj-y += board.o
 lwl-y += lowlevel.o
 bbenv-y += defaultenv-rdu2
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index f3f3a493394d..3cfa0c19870f 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -431,6 +431,9 @@ config MACH_VF610_TWR
 	bool "Freescale VF610 Tower Board"
 	select ARCH_VF610
 
+config MACH_ZII_COMMON
+	bool
+
 config MACH_ZII_RDU1
 	bool "ZII i.MX51 RDU1"
 	select ARCH_IMX51
@@ -441,6 +444,7 @@ config MACH_ZII_RDU2
 	bool "ZII i.MX6Q(+) RDU2"
 	select ARCH_IMX6
 	select MCI_IMX_ESDHC_PBL
+	select MACH_ZII_COMMON
 
 config MACH_ZII_IMX8MQ_DEV
 	bool "ZII i.MX8MQ based devices"
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 2/6] ARM: zii-common: add support for switch reset on RDU1
  2019-03-13 10:56 [PATCH 1/6] ARM: add Zii common directory and move switch reset command Lucas Stach
@ 2019-03-13 10:56 ` Lucas Stach
  2019-03-13 10:56 ` [PATCH 3/6] ARM: zii-common: introduce RDU part-number based fixup abstraction Lucas Stach
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Lucas Stach @ 2019-03-13 10:56 UTC (permalink / raw)
  To: barebox; +Cc: Andrey Smirnov, Chris Healy

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
 arch/arm/boards/zii-common/switch-cmd.c | 38 ++++++++++++++++++++-----
 arch/arm/mach-imx/Kconfig               |  1 +
 include/linux/mfd/rave-sp.h             |  1 +
 3 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/arch/arm/boards/zii-common/switch-cmd.c b/arch/arm/boards/zii-common/switch-cmd.c
index bdba46fb3615..30438053a1ef 100644
--- a/arch/arm/boards/zii-common/switch-cmd.c
+++ b/arch/arm/boards/zii-common/switch-cmd.c
@@ -11,19 +11,16 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-#include <common.h>
 #include <command.h>
+#include <common.h>
 #include <i2c/i2c.h>
+#include <linux/mfd/rave-sp.h>
 
-static int do_rave_switch_reset(int argc, char *argv[])
+static int do_rdu2_switch_reset(void)
 {
 	struct i2c_client client;
 	u8 reg;
 
-	if (!of_machine_is_compatible("zii,imx6q-zii-rdu2") &&
-	    !of_machine_is_compatible("zii,imx6qp-zii-rdu2"))
-		return -ENODEV;
-
 	client.adapter = i2c_get_adapter(1);
 	if (!client.adapter)
 		return -ENODEV;
@@ -42,8 +39,35 @@ static int do_rave_switch_reset(int argc, char *argv[])
 	return 0;
 }
 
+static int do_rdu1_switch_reset(void)
+{
+	struct device_d *sp_dev = get_device_by_name("sp");
+	struct rave_sp *sp = sp_dev->priv;
+	u8 cmd[] = {
+		[0] = RAVE_SP_CMD_RESET_ETH_SWITCH,
+		[1] = 0
+	};
+
+	if (IS_ENABLED(CONFIG_RAVE_SP_CORE))
+		return rave_sp_exec(sp, cmd, sizeof(cmd), NULL, 0);
+	else
+		return -ENODEV;
+}
+
+static int do_rave_switch_reset(int argc, char *argv[])
+{
+	if (of_machine_is_compatible("zii,imx6q-zii-rdu2") ||
+	    of_machine_is_compatible("zii,imx6qp-zii-rdu2"))
+		return do_rdu2_switch_reset();
+
+	if (of_machine_is_compatible("zii,imx51-rdu1"))
+		return do_rdu1_switch_reset();
+
+	return -ENODEV;
+}
+
 BAREBOX_CMD_START(rave_reset_switch)
 	.cmd		= do_rave_switch_reset,
-	BAREBOX_CMD_DESC("reset ethernet switch on RDU2")
+	BAREBOX_CMD_DESC("reset ethernet switch on RDU")
 	BAREBOX_CMD_GROUP(CMD_GRP_HWMANIP)
 BAREBOX_CMD_END
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index 3cfa0c19870f..c4e7500e8fda 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -439,6 +439,7 @@ config MACH_ZII_RDU1
 	select ARCH_IMX51
 	select MACH_FREESCALE_MX51_PDK_POWER
 	select CRC8
+	select MACH_ZII_COMMON
 
 config MACH_ZII_RDU2
 	bool "ZII i.MX6Q(+) RDU2"
diff --git a/include/linux/mfd/rave-sp.h b/include/linux/mfd/rave-sp.h
index 37a37788d885..7b3187cb745c 100644
--- a/include/linux/mfd/rave-sp.h
+++ b/include/linux/mfd/rave-sp.h
@@ -25,6 +25,7 @@ enum rave_sp_command {
 	RAVE_SP_CMD_SET_BACKLIGHT		= 0xA6,
 	RAVE_SP_CMD_RESET			= 0xA7,
 	RAVE_SP_CMD_RESET_REASON		= 0xA8,
+	RAVE_SP_CMD_RESET_ETH_SWITCH		= 0xAF,
 
 	RAVE_SP_CMD_JUMP_TO_BOOTLOADER		= 0xB0,
 	RAVE_SP_CMD_BOOTLOADER			= 0xB1,
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 3/6] ARM: zii-common: introduce RDU part-number based fixup abstraction
  2019-03-13 10:56 [PATCH 1/6] ARM: add Zii common directory and move switch reset command Lucas Stach
  2019-03-13 10:56 ` [PATCH 2/6] ARM: zii-common: add support for switch reset on RDU1 Lucas Stach
@ 2019-03-13 10:56 ` Lucas Stach
  2019-03-13 10:56 ` [PATCH 4/6] ARM: zii-common: fetch network config from SP Lucas Stach
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Lucas Stach @ 2019-03-13 10:56 UTC (permalink / raw)
  To: barebox; +Cc: Andrey Smirnov, Chris Healy

From: Andrey Smirnov <andrew.smirnov@gmail.com>

Multiple generation of RDU boards from ZII come with slight hardware
variation that can be detected and fixed-up correctly based on part
number stored in EEPROMs that are accessible via RAVE SP.

In order to reduce common boilerplate between various RDU boards
introduce a bit of abstraction to allow declaring part-number specific
fixup in RDU board code.

Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
lst: Move into zii-common location.
---
 arch/arm/boards/zii-common/Makefile   |  2 +-
 arch/arm/boards/zii-common/pn-fixup.c | 32 +++++++++
 arch/arm/boards/zii-common/pn-fixup.h | 93 +++++++++++++++++++++++++++
 3 files changed, 126 insertions(+), 1 deletion(-)
 create mode 100644 arch/arm/boards/zii-common/pn-fixup.c
 create mode 100644 arch/arm/boards/zii-common/pn-fixup.h

diff --git a/arch/arm/boards/zii-common/Makefile b/arch/arm/boards/zii-common/Makefile
index 9decfe85fc13..057f2a89c647 100644
--- a/arch/arm/boards/zii-common/Makefile
+++ b/arch/arm/boards/zii-common/Makefile
@@ -1 +1 @@
-obj-y += switch-cmd.o
+obj-y += switch-cmd.o pn-fixup.o
diff --git a/arch/arm/boards/zii-common/pn-fixup.c b/arch/arm/boards/zii-common/pn-fixup.c
new file mode 100644
index 000000000000..a66519991776
--- /dev/null
+++ b/arch/arm/boards/zii-common/pn-fixup.c
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 Zodiac Inflight Innovation
+ *
+ * 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.
+ */
+
+#include <common.h>
+#include <init.h>
+#include <linux/nvmem-consumer.h>
+
+#include "pn-fixup.h"
+
+char *zii_read_part_number(const char *cell_name, size_t cell_size)
+{
+	struct device_node *np;
+
+	np = of_find_node_by_name(NULL, "device-info");
+	if (!np) {
+		pr_warn("No device information found\n");
+		return ERR_PTR(-ENOENT);
+	}
+
+	return nvmem_cell_get_and_read(np, cell_name, cell_size);
+}
diff --git a/arch/arm/boards/zii-common/pn-fixup.h b/arch/arm/boards/zii-common/pn-fixup.h
new file mode 100644
index 000000000000..39b848bd00d3
--- /dev/null
+++ b/arch/arm/boards/zii-common/pn-fixup.h
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2019 Zodiac Inflight Innovation
+ *
+ * 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.
+ */
+
+#ifndef __ZII_PN_FIXUP__
+#define __ZII_PN_FIXUP__
+
+struct zii_pn_fixup {
+	const char *pn;
+	void (*callback) (const struct zii_pn_fixup *fixup);
+};
+
+char *zii_read_part_number(const char *, size_t);
+/**
+ * __zii_process_fixups - Process array of ZII part number based fixups
+ *
+ * @__fixups: Array of part number base fixups
+ * @__cell_name: Name of the NVMEM cell containing the part number
+ * @__cell_size: Size of the NVMEM cell containing the part number
+ *
+ * NOTE: Keeping this code as a marcro allows us to avoid restricting
+ * the type of __fixups to an array of struct zii_pn_fixup. This is
+ * really convenient becuase it allows us to do things like
+ *
+ * struct zii_foo_fixup {
+ * 	struct zii_pn_fixup parent;
+ *	type1 custom_field_1
+ *	type2 custom_field_2
+ *      ...
+ * };
+ *
+ * ...
+ *
+ * const struct zii_foo_fixup foo_fixups[] = {
+ * 	{ fixup1 },
+ * 	{ fixup2 },
+ * 	{ fixup3 },
+ * };
+ *
+ * ...
+ *
+ * __zii_process_fixups(foo_fixups, "blah", BLAH_LENGTH);
+ *
+ * which allows us to have the most compact definition of array of
+ * fixups
+ */
+#define __zii_process_fixups(__fixups, __cell_name, __cell_size)	\
+	do {								\
+		char *__pn = zii_read_part_number(__cell_name,		\
+						  __cell_size);		\
+		const struct zii_pn_fixup *__fixup;			\
+		unsigned int __i;					\
+		bool __match_found = false;				\
+									\
+		if (WARN_ON(IS_ERR(__pn)))				\
+			break;						\
+									\
+		for (__i = 0; __i < ARRAY_SIZE(__fixups); __i++) {	\
+			__fixup =					\
+			  (const struct zii_pn_fixup *) &__fixups[__i]; \
+									\
+			if (strstr(__pn, __fixup->pn)) {		\
+				pr_debug("%s->%pS\n", __func__,		\
+					 __fixup->callback);		\
+				__match_found = true;			\
+				__fixup->callback(__fixup);		\
+			}						\
+		}							\
+		if (!__match_found)					\
+			pr_err("No config fixups found for P/N %s!\n", __pn); \
+		free(__pn);						\
+	} while (0)
+
+#define DDS_PART_NUMBER_SIZE	15
+#define LRU_PART_NUMBER_SIZE	15
+
+#define zii_process_dds_fixups(_fixups)		\
+	__zii_process_fixups(_fixups, "dds-part-number", DDS_PART_NUMBER_SIZE)
+
+#define zii_process_lru_fixups(_fixups)		\
+	__zii_process_fixups(_fixups, "lru-part-number", LRU_PART_NUMBER_SIZE)
+
+#endif	/* __ZII_PN_FIXUP__ */
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 4/6] ARM: zii-common: fetch network config from SP
  2019-03-13 10:56 [PATCH 1/6] ARM: add Zii common directory and move switch reset command Lucas Stach
  2019-03-13 10:56 ` [PATCH 2/6] ARM: zii-common: add support for switch reset on RDU1 Lucas Stach
  2019-03-13 10:56 ` [PATCH 3/6] ARM: zii-common: introduce RDU part-number based fixup abstraction Lucas Stach
@ 2019-03-13 10:56 ` Lucas Stach
  2019-03-13 10:56 ` [PATCH 5/6] ARM: rdu2: Add p/n based fixups for touchscreen and display panel Lucas Stach
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Lucas Stach @ 2019-03-13 10:56 UTC (permalink / raw)
  To: barebox; +Cc: Andrey Smirnov, Chris Healy

On both RDU1 and RDU2 the seat notwork configuration is stored in
a configuration EEPROM accessible via the RAVE SP. Add an initcall
to fetch this configuration and add it to the kernel command line.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
 arch/arm/boards/zii-common/Makefile |  2 +-
 arch/arm/boards/zii-common/board.c  | 44 +++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 arch/arm/boards/zii-common/board.c

diff --git a/arch/arm/boards/zii-common/Makefile b/arch/arm/boards/zii-common/Makefile
index 057f2a89c647..fcc5cdf97dd5 100644
--- a/arch/arm/boards/zii-common/Makefile
+++ b/arch/arm/boards/zii-common/Makefile
@@ -1 +1 @@
-obj-y += switch-cmd.o pn-fixup.o
+obj-y += board.o switch-cmd.o pn-fixup.o
diff --git a/arch/arm/boards/zii-common/board.c b/arch/arm/boards/zii-common/board.c
new file mode 100644
index 000000000000..254b09a7a768
--- /dev/null
+++ b/arch/arm/boards/zii-common/board.c
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2019 Zodiac Inflight Innovation
+ *
+ * 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.
+ */
+
+#include <common.h>
+#include <globalvar.h>
+#include <init.h>
+
+static int rdu_networkconfig(void)
+{
+	static char *rdu_netconfig;
+	struct device_d *sp_dev;
+
+	if (!of_machine_is_compatible("zii,imx6q-zii-rdu2") &&
+	    !of_machine_is_compatible("zii,imx6qp-zii-rdu2") &&
+	    !of_machine_is_compatible("zii,imx51-rdu1"))
+		return 0;
+
+	sp_dev = get_device_by_name("sp");
+	if (!sp_dev) {
+		pr_warn("no sp device found, network config not available!\n");
+		return -ENODEV;
+	}
+
+	rdu_netconfig = basprintf("ip=%s:::%s::eth0:",
+				  dev_get_param(sp_dev, "ipaddr"),
+				  dev_get_param(sp_dev, "netmask"));
+
+	globalvar_add_simple_string("linux.bootargs.rdu_network",
+				    &rdu_netconfig);
+
+	return 0;
+}
+late_initcall(rdu_networkconfig);
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 5/6] ARM: rdu2: Add p/n based fixups for touchscreen and display panel
  2019-03-13 10:56 [PATCH 1/6] ARM: add Zii common directory and move switch reset command Lucas Stach
                   ` (2 preceding siblings ...)
  2019-03-13 10:56 ` [PATCH 4/6] ARM: zii-common: fetch network config from SP Lucas Stach
@ 2019-03-13 10:56 ` Lucas Stach
  2019-03-13 10:56 ` [PATCH 6/6] ARM: rdu2: patch DSA config Lucas Stach
  2019-03-18  8:06 ` [PATCH 1/6] ARM: add Zii common directory and move switch reset command Sascha Hauer
  5 siblings, 0 replies; 7+ messages in thread
From: Lucas Stach @ 2019-03-13 10:56 UTC (permalink / raw)
  To: barebox; +Cc: Andrey Smirnov, Chris Healy

RDU1 devices come in different varietes and, depending on
particular configuration, certain device tree nodes need to be
adjusted accoringly.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
---
 arch/arm/boards/zii-imx6q-rdu2/board.c | 234 +++++++++++++++++++++++++
 arch/arm/dts/imx6qdl-zii-rdu2.dtsi     | 126 ++++++++++++-
 2 files changed, 359 insertions(+), 1 deletion(-)

diff --git a/arch/arm/boards/zii-imx6q-rdu2/board.c b/arch/arm/boards/zii-imx6q-rdu2/board.c
index 6352f49c5a07..1733897a1a40 100644
--- a/arch/arm/boards/zii-imx6q-rdu2/board.c
+++ b/arch/arm/boards/zii-imx6q-rdu2/board.c
@@ -23,6 +23,29 @@
 #include <mach/imx6.h>
 #include <net.h>
 #include <linux/nvmem-consumer.h>
+#include "../zii-common/pn-fixup.h"
+
+enum rdu2_lcd_interface_type {
+	IT_SINGLE_LVDS,
+	IT_DUAL_LVDS,
+	IT_EDP
+};
+
+enum rdu2_lvds_busformat {
+	BF_NONE,
+	BF_JEIDA,
+	BF_SPWG
+};
+
+#define RDU2_LRU_FLAG_EGALAX	BIT(0)
+
+struct rdu2_lru_fixup {
+	struct zii_pn_fixup fixup;
+	unsigned int flags;
+	enum rdu2_lcd_interface_type type;
+	enum rdu2_lvds_busformat bus_format;
+	const char *compatible;
+};
 
 #define RDU2_DAC1_RESET	IMX_GPIO_NR(1, 0)
 #define RDU2_DAC2_RESET	IMX_GPIO_NR(1, 2)
@@ -218,3 +241,214 @@ static int rdu2_i210_invm(void)
 	return 0;
 }
 late_initcall(rdu2_i210_invm);
+
+static int rdu2_fixup_egalax_ts(struct device_node *root, void *context)
+{
+	struct device_node *np;
+
+	/*
+	 * The 32" 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);
+	of_property_write_u32(np->parent, "clock-frequency", 200000);
+
+
+	return 0;
+}
+
+static int rdu2_fixup_edp(struct device_node *root)
+{
+	const bool kernel_fixup = root != NULL;
+	struct device_node *np;
+
+	if (kernel_fixup) {
+		/*
+		 * Kernel DT fixup needs this additional step
+		 */
+		pr_info("Found eDP display, enabling parallel output "
+			"and eDP bridge.\n");
+		np = of_find_compatible_node(root, NULL,
+					     "fsl,imx-parallel-display");
+		if (!np)
+			return -ENODEV;
+
+		of_device_enable(np);
+	}
+
+	np = of_find_compatible_node(root, NULL, "toshiba,tc358767");
+	if (!np)
+		return -ENODEV;
+
+	of_device_enable(np);
+
+	return 0;
+}
+
+static int rdu2_fixup_lvds(struct device_node *root,
+			   const struct rdu2_lru_fixup *fixup)
+{
+	const bool kernel_fixup = root != NULL;
+	struct device_node *np;
+
+	/*
+	 * LVDS panels need the correct compatible
+	 */
+	pr_info("Found LVDS display, enabling %s channel LDB and "
+		"panel with compatible \"%s\".\n",
+		fixup->type == IT_DUAL_LVDS ? "dual" : "single",
+		fixup->compatible);
+	/*
+	 * LVDS panels need the correct timings
+	 */
+	np = of_find_node_by_name(root, "panel");
+	if (!np)
+		return -ENODEV;
+
+	if (kernel_fixup) {
+		of_device_enable(np);
+		of_property_write_string(np, "compatible", fixup->compatible);
+	} else {
+		struct device_node *child, *tmp;
+
+		of_device_enable_and_register(np);
+		/*
+		 * Delete all mode entries, which aren't suited for the
+		 * current display
+		 */
+		np = of_find_node_by_name(np, "display-timings");
+		if (!np)
+			return -ENODEV;
+
+		for_each_child_of_node_safe(np, tmp, child) {
+			if (!of_device_is_compatible(child,
+						     fixup->compatible))
+				of_delete_node(child);
+		}
+	}
+	/*
+	 * enable LDB channel 0 and set correct interface mode
+	 */
+	np = of_find_compatible_node(root, NULL, "fsl,imx6q-ldb");
+	if (!np)
+		return -ENODEV;
+
+	if (kernel_fixup)
+		of_device_enable(np);
+	else
+		of_device_enable_and_register(np);
+
+	if (fixup->type == IT_DUAL_LVDS)
+		of_set_property(np, "fsl,dual-channel", NULL, 0, 1);
+
+	np = of_find_node_by_name(np, "lvds-channel@0");
+	if (!np)
+		return -ENODEV;
+
+	of_device_enable(np);
+
+	if (!kernel_fixup) {
+		of_property_write_string(np, "fsl,data-mapping",
+					 fixup->bus_format == BF_SPWG ?
+					 "spwg" : "jeida");
+	}
+
+	return 0;
+}
+
+static int rdu2_fixup_display(struct device_node *root, void *context)
+{
+	const struct rdu2_lru_fixup *fixup = context;
+	/*
+	 * If the panel is eDP, just enable the parallel output and
+	 * eDP bridge
+	 */
+	if (fixup->type == IT_EDP)
+		return rdu2_fixup_edp(root);
+
+	return rdu2_fixup_lvds(root, context);
+}
+
+static void rdu2_lru_fixup(const struct zii_pn_fixup *context)
+{
+	const struct rdu2_lru_fixup *fixup =
+		container_of(context, struct rdu2_lru_fixup, fixup);
+
+	WARN_ON(rdu2_fixup_display(NULL, (void *)context));
+	of_register_fixup(rdu2_fixup_display, (void *)context);
+
+	if (fixup->flags & RDU2_LRU_FLAG_EGALAX)
+		of_register_fixup(rdu2_fixup_egalax_ts, NULL);
+}
+
+#define RDU2_LRU_FIXUP(__pn, __flags, __panel)		\
+	{						\
+		{ __pn, rdu2_lru_fixup },		\
+		__flags,				\
+		__panel					\
+	}
+
+#define RDU2_PANEL_10P1	IT_SINGLE_LVDS, BF_SPWG,  "innolux,g121i1-l01"
+#define RDU2_PANEL_11P6	IT_EDP,         BF_NONE,  NULL
+#define RDU2_PANEL_12P1	IT_SINGLE_LVDS, BF_SPWG,  "nec,nl12880bc20-05"
+#define RDU2_PANEL_13P3	IT_DUAL_LVDS,   BF_JEIDA, "auo,g133han01"
+#define RDU2_PANEL_15P6	IT_DUAL_LVDS,   BF_SPWG,  "nlt,nl192108ac18-02d"
+#define RDU2_PANEL_18P5	IT_DUAL_LVDS,   BF_SPWG,  "auo,g185han01"
+#define RDU2_PANEL_32P0	IT_DUAL_LVDS,   BF_SPWG,  "auo,p320hvn03"
+
+static const struct rdu2_lru_fixup rdu2_lru_fixups[] = {
+	RDU2_LRU_FIXUP("00-5122-01", 0, RDU2_PANEL_12P1),
+	RDU2_LRU_FIXUP("00-5122-02", 0, RDU2_PANEL_12P1),
+	RDU2_LRU_FIXUP("00-5120-01", 0, RDU2_PANEL_10P1),
+	RDU2_LRU_FIXUP("00-5120-02", 0, RDU2_PANEL_10P1),
+	RDU2_LRU_FIXUP("00-5120-51", 0, RDU2_PANEL_10P1),
+	RDU2_LRU_FIXUP("00-5120-52", 0, RDU2_PANEL_10P1),
+	RDU2_LRU_FIXUP("00-5123-01", 0, RDU2_PANEL_11P6),
+	RDU2_LRU_FIXUP("00-5123-02", 0, RDU2_PANEL_11P6),
+	RDU2_LRU_FIXUP("00-5123-03", 0, RDU2_PANEL_11P6),
+	RDU2_LRU_FIXUP("00-5123-51", 0, RDU2_PANEL_11P6),
+	RDU2_LRU_FIXUP("00-5123-52", 0, RDU2_PANEL_11P6),
+	RDU2_LRU_FIXUP("00-5123-53", 0, RDU2_PANEL_11P6),
+	RDU2_LRU_FIXUP("00-5124-01", 0, RDU2_PANEL_13P3),
+	RDU2_LRU_FIXUP("00-5124-02", 0, RDU2_PANEL_13P3),
+	RDU2_LRU_FIXUP("00-5124-03", 0, RDU2_PANEL_13P3),
+	RDU2_LRU_FIXUP("00-5124-53", 0, RDU2_PANEL_13P3),
+	RDU2_LRU_FIXUP("00-5127-01", 0, RDU2_PANEL_15P6),
+	RDU2_LRU_FIXUP("00-5127-02", 0, RDU2_PANEL_15P6),
+	RDU2_LRU_FIXUP("00-5127-03", 0, RDU2_PANEL_15P6),
+	RDU2_LRU_FIXUP("00-5127-53", 0, RDU2_PANEL_15P6),
+	RDU2_LRU_FIXUP("00-5125-01", 0, RDU2_PANEL_18P5),
+	RDU2_LRU_FIXUP("00-5125-02", 0, RDU2_PANEL_18P5),
+	RDU2_LRU_FIXUP("00-5125-03", 0, RDU2_PANEL_18P5),
+	RDU2_LRU_FIXUP("00-5125-53", 0, RDU2_PANEL_18P5),
+	RDU2_LRU_FIXUP("00-5132-01", RDU2_LRU_FLAG_EGALAX, RDU2_PANEL_32P0),
+	RDU2_LRU_FIXUP("00-5132-02", RDU2_LRU_FLAG_EGALAX, RDU2_PANEL_32P0),
+};
+
+/*
+ * This initcall needs to be executed before coredevices, so we have a chance
+ * to fix up the internal DT with the correct display information.
+ */
+static int rdu2_process_fixups(void)
+{
+	if (!of_machine_is_compatible("zii,imx6q-zii-rdu2") &&
+	    !of_machine_is_compatible("zii,imx6qp-zii-rdu2"))
+		return 0;
+
+	zii_process_lru_fixups(rdu2_lru_fixups);
+
+	return 0;
+}
+postmmu_initcall(rdu2_process_fixups);
diff --git a/arch/arm/dts/imx6qdl-zii-rdu2.dtsi b/arch/arm/dts/imx6qdl-zii-rdu2.dtsi
index fea219f1e15a..bfc75ba606d6 100644
--- a/arch/arm/dts/imx6qdl-zii-rdu2.dtsi
+++ b/arch/arm/dts/imx6qdl-zii-rdu2.dtsi
@@ -49,6 +49,11 @@
 		};
 	};
 
+	device-info {
+		nvmem-cells = <&lru_part_number>;
+		nvmem-cell-names = "lru-part-number";
+	};
+
 	aliases {
 		ethernet0 = &fec;
 		ethernet1 = &i210;
@@ -59,8 +64,96 @@
 		 */
 		switch-eeprom = &switch;
 	};
-};
 
+	panel {
+		compatible = "simple-panel";
+		/* Timings for all supported panels, the correct one is enabled
+		 * after the board data has been retrieved from the environment
+		 * controller
+		*/
+
+		display-timings {
+			innolux-g121i1-l01 {
+				compatible = "innolux,g121i1-l01";
+
+				hback-porch = <79>;
+				hfront-porch = <80>;
+				hactive = <1280>;
+				hsync-len = <1>;
+				vback-porch = <11>;
+				vfront-porch = <11>;
+				vactive = <800>;
+				vsync-len = <1>;
+				clock-frequency = <71000000>;
+			};
+			nec-nl12880bc20-05 {
+				compatible = "nec,nl12880bc20-05";
+
+				hback-porch = <100>;
+				hfront-porch = <30>;
+				hactive = <1280>;
+				hsync-len = <30>;
+				vback-porch = <11>;
+				vfront-porch = <5>;
+				vactive = <800>;
+				vsync-len = <7>;
+				clock-frequency = <71000000>;
+			};
+			auo-g133han01 {
+				compatible = "auo,g133han01";
+
+				hback-porch = <88>;
+				hfront-porch = <58>;
+				hactive = <1920>;
+				hsync-len = <42>;
+				vback-porch = <14>;
+				vfront-porch = <8>;
+				vactive = <1080>;
+				vsync-len = <14>;
+				clock-frequency = <141200000>;
+			};
+			auo-g185han01 {
+				compatible = "auo,g185han01";
+
+				hback-porch = <44>;
+				hfront-porch = <60>;
+				hactive = <1920>;
+				hsync-len = <24>;
+				vback-porch = <5>;
+				vfront-porch = <10>;
+				vactive = <1080>;
+				vsync-len = <5>;
+				clock-frequency = <144000000>;
+			};
+			nlt-nl192108ac18-02d {
+				compatible = "nlt,nl192108ac18-02d";
+
+				hback-porch = <120>;
+				hfront-porch = <100>;
+				hactive = <1920>;
+				hsync-len = <60>;
+				vback-porch = <10>;
+				vfront-porch = <30>;
+				vactive = <1080>;
+				vsync-len = <5>;
+				clock-frequency = <148350000>;
+			};
+			auo-p320hvn03 {
+				compatible = "auo,p320hvn03";
+
+				hback-porch = <50>;
+				hfront-porch = <50>;
+				hactive = <1920>;
+				hsync-len = <40>;
+				vback-porch = <17>;
+				vfront-porch = <17>;
+				vactive = <1080>;
+				vsync-len = <11>;
+				clock-frequency = <148500000>;
+			};
+		};
+	};
+};
 
 &uart4 {
 	rave-sp {
@@ -73,6 +166,11 @@
 		};
 
 		eeprom@a4 {
+			lru_part_number: lru-part-number@21 {
+				reg = <0x21 15>;
+				read-only;
+			};
+
 			boot_source: boot-source@83 {
 				reg = <0x83 1>;
 			};
@@ -110,12 +208,38 @@
 	nvmem-cell-names = "mac-address";
 };
 
+&i2c1 {
+	edp-bridge@68 {
+		pinctrl-0 = <&pinctrl_tc358767>, <&pinctrl_disp0>;
+
+		ports {
+			port@1 {
+				reg = <1>;
+
+				tc358767_in: endpoint {
+					remote-endpoint = <&disp0_out>;
+				};
+			};
+		};
+	};
+};
+
 &i2c2 {
 	temp-sense@48 {
 		barebox,sensor-name = "Temp Sensor 1";
 	};
 };
 
+&ipu1_di0_disp0 {
+	remote-endpoint = <&tc358767_in>;
+};
+
+&ldb {
+	lvds-channel@0 {
+		fsl,data-width = <24>;
+	};
+};
+
 &i210 {
 	nvmem-cells = <&mac_address_1>;
 	nvmem-cell-names = "mac-address";
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 6/6] ARM: rdu2: patch DSA config
  2019-03-13 10:56 [PATCH 1/6] ARM: add Zii common directory and move switch reset command Lucas Stach
                   ` (3 preceding siblings ...)
  2019-03-13 10:56 ` [PATCH 5/6] ARM: rdu2: Add p/n based fixups for touchscreen and display panel Lucas Stach
@ 2019-03-13 10:56 ` Lucas Stach
  2019-03-18  8:06 ` [PATCH 1/6] ARM: add Zii common directory and move switch reset command Sascha Hauer
  5 siblings, 0 replies; 7+ messages in thread
From: Lucas Stach @ 2019-03-13 10:56 UTC (permalink / raw)
  To: barebox; +Cc: Andrey Smirnov, Chris Healy

From: Andrey Smirnov <andrew.smirnov@gmail.com>

This patches the DSA switch config in the kernel DT if the unit is
a 12.1" one, which doesn't have the FEC wired up to the switch.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
[andrew.smirnov@gmail.com: Ported the patch to use p/n fixups]
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
---
 arch/arm/boards/zii-imx6q-rdu2/board.c | 46 ++++++++++++++++++++++++--
 1 file changed, 44 insertions(+), 2 deletions(-)

diff --git a/arch/arm/boards/zii-imx6q-rdu2/board.c b/arch/arm/boards/zii-imx6q-rdu2/board.c
index 1733897a1a40..344a654f23f1 100644
--- a/arch/arm/boards/zii-imx6q-rdu2/board.c
+++ b/arch/arm/boards/zii-imx6q-rdu2/board.c
@@ -38,6 +38,7 @@ enum rdu2_lvds_busformat {
 };
 
 #define RDU2_LRU_FLAG_EGALAX	BIT(0)
+#define RDU2_LRU_FLAG_NO_FEC	BIT(1)
 
 struct rdu2_lru_fixup {
 	struct zii_pn_fixup fixup;
@@ -269,6 +270,44 @@ static int rdu2_fixup_egalax_ts(struct device_node *root, void *context)
 	return 0;
 }
 
+static int rdu2_fixup_dsa(struct device_node *root, void *context)
+{
+	struct device_node *switch_np, *np;
+	phandle i210_handle;
+
+	/*
+	 * The 12.1" unit has no FEC connection, so we need to rewrite
+	 * the i210 port into the CPU port and delete the FEC port,
+	 * which is part of the common setup.
+	 */
+	pr_info("Rewriting i210 switch port into CPU port\n");
+
+	switch_np = of_find_compatible_node(root, NULL, "marvell,mv88e6085");
+	if (!switch_np)
+		return -ENODEV;
+
+	np = of_find_node_by_name(switch_np, "port@2");
+	if (!np)
+		return -ENODEV;
+
+	of_delete_node(np);
+
+	np = of_find_node_by_name(root, "i210@0");
+	if (!np)
+		return -ENODEV;
+
+	i210_handle = of_node_create_phandle(np);
+
+	np = of_find_node_by_name(switch_np, "port@0");
+	if (!np)
+		return -ENODEV;
+
+	of_property_write_u32(np, "ethernet", i210_handle);
+	of_property_write_string(np, "label", "cpu");
+
+	return 0;
+}
+
 static int rdu2_fixup_edp(struct device_node *root)
 {
 	const bool kernel_fixup = root != NULL;
@@ -391,6 +430,9 @@ static void rdu2_lru_fixup(const struct zii_pn_fixup *context)
 
 	if (fixup->flags & RDU2_LRU_FLAG_EGALAX)
 		of_register_fixup(rdu2_fixup_egalax_ts, NULL);
+
+	if (fixup->flags & RDU2_LRU_FLAG_NO_FEC)
+		of_register_fixup(rdu2_fixup_dsa, NULL);
 }
 
 #define RDU2_LRU_FIXUP(__pn, __flags, __panel)		\
@@ -409,8 +451,8 @@ static void rdu2_lru_fixup(const struct zii_pn_fixup *context)
 #define RDU2_PANEL_32P0	IT_DUAL_LVDS,   BF_SPWG,  "auo,p320hvn03"
 
 static const struct rdu2_lru_fixup rdu2_lru_fixups[] = {
-	RDU2_LRU_FIXUP("00-5122-01", 0, RDU2_PANEL_12P1),
-	RDU2_LRU_FIXUP("00-5122-02", 0, RDU2_PANEL_12P1),
+	RDU2_LRU_FIXUP("00-5122-01", RDU2_LRU_FLAG_NO_FEC, RDU2_PANEL_12P1),
+	RDU2_LRU_FIXUP("00-5122-02", RDU2_LRU_FLAG_NO_FEC, RDU2_PANEL_12P1),
 	RDU2_LRU_FIXUP("00-5120-01", 0, RDU2_PANEL_10P1),
 	RDU2_LRU_FIXUP("00-5120-02", 0, RDU2_PANEL_10P1),
 	RDU2_LRU_FIXUP("00-5120-51", 0, RDU2_PANEL_10P1),
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/6] ARM: add Zii common directory and move switch reset command
  2019-03-13 10:56 [PATCH 1/6] ARM: add Zii common directory and move switch reset command Lucas Stach
                   ` (4 preceding siblings ...)
  2019-03-13 10:56 ` [PATCH 6/6] ARM: rdu2: patch DSA config Lucas Stach
@ 2019-03-18  8:06 ` Sascha Hauer
  5 siblings, 0 replies; 7+ messages in thread
From: Sascha Hauer @ 2019-03-18  8:06 UTC (permalink / raw)
  To: Lucas Stach; +Cc: Andrey Smirnov, barebox, Chris Healy

On Wed, Mar 13, 2019 at 11:56:30AM +0100, Lucas Stach wrote:
> The Zii boards share some functionality across different boards. Add
> a common directory, so we can implement this once and use across
> different boards.
> 
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
> ---
>  arch/arm/boards/Makefile                                    | 1 +
>  arch/arm/boards/zii-common/Makefile                         | 1 +
>  arch/arm/boards/{zii-imx6q-rdu2 => zii-common}/switch-cmd.c | 0
>  arch/arm/boards/zii-imx6q-rdu2/Makefile                     | 2 +-
>  arch/arm/mach-imx/Kconfig                                   | 4 ++++
>  5 files changed, 7 insertions(+), 1 deletion(-)
>  create mode 100644 arch/arm/boards/zii-common/Makefile
>  rename arch/arm/boards/{zii-imx6q-rdu2 => zii-common}/switch-cmd.c (100%)

Applied, thanks

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2019-03-18  8:06 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-13 10:56 [PATCH 1/6] ARM: add Zii common directory and move switch reset command Lucas Stach
2019-03-13 10:56 ` [PATCH 2/6] ARM: zii-common: add support for switch reset on RDU1 Lucas Stach
2019-03-13 10:56 ` [PATCH 3/6] ARM: zii-common: introduce RDU part-number based fixup abstraction Lucas Stach
2019-03-13 10:56 ` [PATCH 4/6] ARM: zii-common: fetch network config from SP Lucas Stach
2019-03-13 10:56 ` [PATCH 5/6] ARM: rdu2: Add p/n based fixups for touchscreen and display panel Lucas Stach
2019-03-13 10:56 ` [PATCH 6/6] ARM: rdu2: patch DSA config Lucas Stach
2019-03-18  8:06 ` [PATCH 1/6] ARM: add Zii common directory and move switch reset command Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox