aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ramips/patches-4.9/0200-linkit_bootstrap.patch
blob: 4fd5448e925dd7b9507eb18bbbd180969f60e478 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -54,6 +54,7 @@ obj-$(CONFIG_ECHO)		+= echo/
 obj-$(CONFIG_VEXPRESS_SYSCFG)	+= vexpress-syscfg.o
 obj-$(CONFIG_CXL_BASE)		+= cxl/
 obj-$(CONFIG_PANEL)             += panel.o
+obj-$(CONFIG_SOC_MT7620)	+= linkit.o
 
 lkdtm-$(CONFIG_LKDTM)		+= lkdtm_core.o
 lkdtm-$(CONFIG_LKDTM)		+= lkdtm_bugs.o
--- /dev/null
+++ b/drivers/misc/linkit.c
@@ -0,0 +1,84 @@
+/*
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  publishhed by the Free Software Foundation.
+ *
+ *  Copyright (C) 2015 John Crispin <blogic@openwrt.org>
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/of.h>
+#include <linux/mtd/mtd.h>
+#include <linux/gpio.h>
+
+#define LINKIT_LATCH_GPIO	11
+
+struct linkit_hw_data {
+	char board[16];
+	char rev[16];
+};
+
+static void sanify_string(char *s)
+{
+	int i;
+
+	for (i = 0; i < 15; i++)
+		if (s[i] <= 0x20)
+			s[i] = '\0';
+	s[15] = '\0';
+}
+
+static int linkit_probe(struct platform_device *pdev)
+{
+	struct linkit_hw_data hw;
+	struct mtd_info *mtd;
+	size_t retlen;
+	int ret;
+
+	mtd = get_mtd_device_nm("factory");
+	if (IS_ERR(mtd))
+		return PTR_ERR(mtd);
+
+	ret = mtd_read(mtd, 0x400, sizeof(hw), &retlen, (u_char *) &hw);
+	put_mtd_device(mtd);
+
+	sanify_string(hw.board);
+	sanify_string(hw.rev);
+
+	dev_info(&pdev->dev, "Version  : %s\n", hw.board);
+	dev_info(&pdev->dev, "Revision : %s\n", hw.rev);
+
+	if (!strcmp(hw.board, "LINKITS7688")) {
+		dev_info(&pdev->dev, "setting up bootstrap latch\n");
+
+		if (devm_gpio_request(&pdev->dev, LINKIT_LATCH_GPIO, "bootstrap")) {
+			dev_err(&pdev->dev, "failed to setup bootstrap gpio\n");
+			return -1;
+		}
+		gpio_direction_output(LINKIT_LATCH_GPIO, 0);
+	}
+
+	return 0;
+}
+
+static const struct of_device_id linkit_match[] = {
+	{ .compatible = "mediatek,linkit" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, linkit_match);
+
+static struct platform_driver linkit_driver = {
+	.probe = linkit_probe,
+	.driver = {
+		.name = "mtk-linkit",
+		.owner = THIS_MODULE,
+		.of_match_table = linkit_match,
+	},
+};
+
+int __init linkit_init(void)
+{
+	return platform_driver_register(&linkit_driver);
+}
+late_initcall_sync(linkit_init);