@@ -23,6 +23,9 @@ extern void bonito_irq_init(void);
extern void mach_prepare_reboot(void);
extern void mach_prepare_shutdown(void);
+/* machine-specific platform driver registration */
+extern int mach_platform_init(void) __init;
+
/* environment arguments from bootloader */
extern u32 cpu_clock_freq;
extern u32 memsize, highmemsize;
@@ -11,6 +11,7 @@
#include <linux/err.h>
#include <linux/smp.h>
#include <linux/platform_device.h>
+#include <loongson.h>
static struct platform_device loongson2_cpufreq_device = {
.name = "loongson2_cpufreq",
@@ -29,3 +30,17 @@ static int __init loongson2_cpufreq_init(void)
}
arch_initcall(loongson2_cpufreq_init);
+
+/*
+ * Currently, only LEMOTE_MACH2F implements mach_platform_init();
+ * Fuloong-2E or Loongson3 does not have platform drivers to register
+ * at here yet.
+ */
+#ifdef CONFIG_LEMOTE_MACH2F
+static int __init loongson2_platform_init(void)
+{
+ return mach_platform_init();
+}
+
+device_initcall(loongson2_platform_init);
+#endif
@@ -2,7 +2,7 @@
# Makefile for lemote loongson2f family machines
#
-obj-y += clock.o machtype.o irq.o reset.o dma.o
+obj-y += clock.o machtype.o irq.o reset.o dma.o platform.o
#
# Suspend Support
new file mode 100644
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+/*
+ * Copyright (C) 2009 Lemote Inc.
+ * Author: Wu Zhangjin, wuzhangjin@gmail.com
+ *
+ * Copyright (C) 2019 Yifeng Li
+ * Author: Yifeng Li <tomli@tomli.me>
+ */
+
+#include <asm/bootinfo.h>
+#include <linux/platform_device.h>
+#include <linux/mfd/yeeloong_kb3310b.h>
+
+static struct kb3310b_chip yeeloong_ec_info;
+
+static struct platform_device yeeloong_ec_device = {
+ .name = "yeeloong_kb3310b",
+ .id = -1,
+ .dev = {
+ .platform_data = &yeeloong_ec_info,
+ },
+};
+
+int __init mach_platform_init(void)
+{
+ /*
+ * arcs_cmdline is __initdata, which will be freed after boot and cannot
+ * be used. We extract the EC version string from it, and pass it to
+ * yeeloong-kb3310b driver as platform data.
+ */
+ static const char token[] = "EC_VER=";
+ char *p;
+
+ p = strstr(arcs_cmdline, token);
+ if (!p)
+ memset(yeeloong_ec_info.version, 0, KB3310B_VERSION_LEN);
+ else {
+ p += ARRAY_SIZE(token) - 1;
+ strncpy(yeeloong_ec_info.version, p, KB3310B_VERSION_LEN);
+ p = strstr(yeeloong_ec_info.version, " ");
+ if (p)
+ *p = '\0';
+ }
+
+ return platform_device_register(&yeeloong_ec_device);
+}
Currently, common/platform.c registers the Loongson 2F cpufreq driver during boot time for all boards. To support platform drivers for Lemote Yeeloong laptops, we need to register more drivers. First, we add support for per-board platform drivers. Just like how IRQ, DMA, or reset logic is implemented for each board, we introduces a call of mach_platform_init() in common/platform.c, to allow each board to have its own platform.c to register platform drivers. Then, we implement lemote-2f/platform.c to register the MFD driver for Yeeloong laptops. So far, only one board, lemote-f2, is using this facility, so we hardcode the call of mach_platform_init() in common/platform.c as a ifdef for now. Signed-off-by: Yifeng Li <tomli@tomli.me> --- .../include/asm/mach-loongson64/loongson.h | 3 ++ arch/mips/loongson64/common/platform.c | 15 ++++++ arch/mips/loongson64/lemote-2f/Makefile | 2 +- arch/mips/loongson64/lemote-2f/platform.c | 47 +++++++++++++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 arch/mips/loongson64/lemote-2f/platform.c