void sysmgr_pinmux_init(void);
 void sysmgr_config_warmrstcfgio(int enable);
 
-/* declaration for handoff table type */
-extern unsigned long sys_mgr_init_table[CONFIG_HPS_PINMUX_NUM];
-
+void sysmgr_get_pinmux_table(const unsigned long **table,
+                            unsigned int *table_len);
 #endif
 
 struct socfpga_system_manager {
 
 void sysmgr_pinmux_init(void)
 {
        uint32_t regs = (uint32_t)&sysmgr_regs->emacio[0];
+       const unsigned long *sys_mgr_init_table;
+       unsigned int len;
        int i;
 
-       for (i = 0; i < ARRAY_SIZE(sys_mgr_init_table); i++) {
+       sysmgr_get_pinmux_table(&sys_mgr_init_table, &len);
+
+       for (i = 0; i < len; i++) {
                writel(sys_mgr_init_table[i], regs);
                regs += sizeof(regs);
        }
 
--- /dev/null
+/*
+ * Copyright (C) 2015 Marek Vasut <marex@denx.de>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <errno.h>
+/*
+ * Yes, dear reader, we're including a C file here, this is no mistake.
+ * But this time around, we do even more perverse hacking here to be
+ * compatible with QTS headers and obtain reasonably nice results too.
+ *
+ * First, we define _PRELOADER_PINMUX_CONFIG_H_, which will neutralise
+ * the pinmux_config.h inclusion in pinmux_config.c . Since we are
+ * probing everything from DT, we do NOT want those macros from the
+ * pinmux_config.h to ooze into our build system, anywhere, ever. So
+ * we nip it at the bud.
+ *
+ * Next, pinmux_config.c needs CONFIG_HPS_PINMUX_NUM and uses it to
+ * specify sized array explicitly. Instead, we want to use ARRAY_SIZE
+ * to figure out the size of the array, so define this macro as an
+ * empty one, so that the preprocessor optimizes things such that the
+ * arrays are not sized by default.
+ */
+#define _PRELOADER_PINMUX_CONFIG_H_
+#define CONFIG_HPS_PINMUX_NUM
+#include "qts/pinmux_config.c"
+
+void sysmgr_get_pinmux_table(const unsigned long **table,
+                            unsigned int *table_len)
+{
+       *table = sys_mgr_init_table;
+       *table_len = ARRAY_SIZE(sys_mgr_init_table);
+}