summaryrefslogtreecommitdiffstats
path: root/resources/libreboot/patch/coreboot/369b561315ca68d0cdedc38208105a513c7139b5/grub/kcma-d8/0024-superio-winbond-w83667hg-a-Add-support-for-W83667HG-.patch
blob: b4be5fafe43349faaccc8a84323f42ba7436174c (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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
From 42a116b68ea468e32bb37aa333e53eb9c552a6c7 Mon Sep 17 00:00:00 2001
From: Timothy Pearson <tpearson@raptorengineeringinc.com>
Date: Tue, 24 Nov 2015 14:11:57 -0600
Subject: [PATCH 24/45] superio/winbond/w83667hg-a: Add support for W83667HG-A

The KGPE-D16 and KCMA-D8 use a Winbond W83667HG-A SuperIO.  While
the Nuvoton NCT5572D is effectively the same core, and a close
enough match to get things working initially, the W83667HG-A
has a different LDN mapping and several extra features that
require a separate support driver.

Clone the Nuvoton NCT5572D and modify according to the W83667HG-A
datasheet.

Signed-off-by: Timothy Pearson <tpearson@raptorengineeringinc.com>
---
 src/superio/winbond/Kconfig                 |   4 +
 src/superio/winbond/Makefile.inc            |   1 +
 src/superio/winbond/w83667hg-a/Makefile.inc |  19 +++++
 src/superio/winbond/w83667hg-a/superio.c    | 109 ++++++++++++++++++++++++++++
 src/superio/winbond/w83667hg-a/w83667hg-a.h |  47 ++++++++++++
 5 files changed, 180 insertions(+)
 create mode 100644 src/superio/winbond/w83667hg-a/Makefile.inc
 create mode 100644 src/superio/winbond/w83667hg-a/superio.c
 create mode 100644 src/superio/winbond/w83667hg-a/w83667hg-a.h

diff --git a/src/superio/winbond/Kconfig b/src/superio/winbond/Kconfig
index ba9f479..1731a7f 100644
--- a/src/superio/winbond/Kconfig
+++ b/src/superio/winbond/Kconfig
@@ -39,6 +39,10 @@ config SUPERIO_WINBOND_W83627UHG
 	bool
 	select SUPERIO_WINBOND_COMMON_ROMSTAGE
 
+config SUPERIO_WINBOND_W83667HG_A
+	bool
+	select SUPERIO_WINBOND_COMMON_ROMSTAGE
+
 config SUPERIO_WINBOND_W83697HF
 	bool
 	select SUPERIO_WINBOND_COMMON_ROMSTAGE
diff --git a/src/superio/winbond/Makefile.inc b/src/superio/winbond/Makefile.inc
index 67927dc..ae4b283 100644
--- a/src/superio/winbond/Makefile.inc
+++ b/src/superio/winbond/Makefile.inc
@@ -21,6 +21,7 @@ subdirs-y += w83627ehg
 subdirs-y += w83627hf
 subdirs-y += w83627thg
 subdirs-y += w83627uhg
+subdirs-y += w83667hg-a
 subdirs-y += w83697hf
 subdirs-y += w83977tf
 subdirs-y += wpcd376i
diff --git a/src/superio/winbond/w83667hg-a/Makefile.inc b/src/superio/winbond/w83667hg-a/Makefile.inc
new file mode 100644
index 0000000..7665046
--- /dev/null
+++ b/src/superio/winbond/w83667hg-a/Makefile.inc
@@ -0,0 +1,19 @@
+##
+## This file is part of the coreboot project.
+##
+## Copyright (C) 2011 - 2012 Advanced Micro Devices, Inc.
+## Copyright (C) 2014 Felix Held <felix-coreboot@felixheld.de>
+## Copyright (C) 2015 Raptor Engineering
+##
+## 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.
+##
+
+ramstage-$(CONFIG_SUPERIO_WINBOND_W83667HG_A) += superio.c
diff --git a/src/superio/winbond/w83667hg-a/superio.c b/src/superio/winbond/w83667hg-a/superio.c
new file mode 100644
index 0000000..b539871
--- /dev/null
+++ b/src/superio/winbond/w83667hg-a/superio.c
@@ -0,0 +1,109 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2014 Felix Held <felix-coreboot@felixheld.de>
+ * Copyright (C) 2014 Edward O'Callaghan <eocallaghan@alterapraxis.com>
+ * Copyright (C) 2015 Raptor Engineering
+ *
+ * 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 <console/console.h>
+#include <arch/io.h>
+#include <device/device.h>
+#include <device/pnp.h>
+#include <pc80/keyboard.h>
+#include <pc80/mc146818rtc.h>
+#include <stdlib.h>
+#include <superio/conf_mode.h>
+
+#include "w83667hg-a.h"
+
+#define MAINBOARD_POWER_OFF 0
+#define MAINBOARD_POWER_ON 1
+
+#ifndef CONFIG_MAINBOARD_POWER_ON_AFTER_POWER_FAIL
+#define CONFIG_MAINBOARD_POWER_ON_AFTER_POWER_FAIL MAINBOARD_POWER_ON
+#endif
+
+static void w83667hg_a_init(struct device *dev)
+{
+	uint8_t byte;
+	uint8_t power_status;
+
+	if (!dev->enabled)
+		return;
+
+	switch(dev->path.pnp.device) {
+	/* TODO: Might potentially need code for HWM or FDC etc. */
+	case W83667HG_A_KBC:
+		pc_keyboard_init();
+		break;
+	case W83667HG_A_ACPI:
+		/* Set power state after power fail */
+		power_status = CONFIG_MAINBOARD_POWER_ON_AFTER_POWER_FAIL;
+		get_option(&power_status, "power_on_after_fail");
+		pnp_enter_conf_mode_8787(dev);
+		pnp_set_logical_device(dev);
+		byte = pnp_read_config(dev, 0xe4);
+		byte &= ~0x60;
+		if (power_status == 1)
+			byte |= (0x1 << 5);    /* Force power on */
+		else if (power_status == 2)
+			byte |= (0x2 << 5);    /* Use last power state */
+		pnp_write_config(dev, 0xe4, byte);
+		pnp_exit_conf_mode_aa(dev);
+		printk(BIOS_INFO, "set power %s after power fail\n", power_status ? "on" : "off");
+		break;
+	}
+}
+
+static struct device_operations ops = {
+	.read_resources   = pnp_read_resources,
+	.set_resources    = pnp_set_resources,
+	.enable_resources = pnp_enable_resources,
+	.enable           = pnp_alt_enable,
+	.init             = w83667hg_a_init,
+	.ops_pnp_mode     = &pnp_conf_mode_8787_aa,
+};
+
+static struct pnp_info pnp_dev_info[] = {
+	{ &ops, W83667HG_A_FDC, PNP_IO0 | PNP_IRQ0 | PNP_DRQ0, {0x0ff8, 0}, },
+	{ &ops, W83667HG_A_PP, PNP_IO0 | PNP_IRQ0 | PNP_DRQ0, {0x0ff8, 0}, },
+	{ &ops, W83667HG_A_SP1, PNP_IO0 | PNP_IRQ0, {0x0ff8, 0}, },
+	{ &ops, W83667HG_A_SP2, PNP_IO0 | PNP_IRQ0, {0x0ff8, 0}, },
+	{ &ops, W83667HG_A_KBC, PNP_IO0 | PNP_IO1 | PNP_IRQ0 | PNP_IRQ1, {0x0fff, 0}, {0x0fff, 4}, },
+	{ &ops, W83667HG_A_SPI},
+	{ &ops, W83667HG_A_WDT1},
+	{ &ops, W83667HG_A_ACPI},
+	{ &ops, W83667HG_A_HWM_TSI, PNP_IO0 | PNP_IO1 | PNP_IRQ0, {0x0ffe, 0}, {0x0ffe, 4}, },
+	{ &ops, W83667HG_A_PECI},
+	{ &ops, W83667HG_A_VID_BUSSEL},
+	{ &ops, W83667HG_A_GPIO_PP_OD},
+	{ &ops, W83667HG_A_GPIO2},
+	{ &ops, W83667HG_A_GPIO3},
+	{ &ops, W83667HG_A_GPIO4},
+	{ &ops, W83667HG_A_GPIO5},
+	{ &ops, W83667HG_A_GPIO6},
+	{ &ops, W83667HG_A_GPIO7},
+	{ &ops, W83667HG_A_GPIO8},
+	{ &ops, W83667HG_A_GPIO9},
+};
+
+static void enable_dev(struct device *dev)
+{
+	pnp_enable_devices(dev, &ops, ARRAY_SIZE(pnp_dev_info), pnp_dev_info);
+}
+
+struct chip_operations superio_winbond_w83667hg_a_ops = {
+	CHIP_NAME("WINBOND W83667HG-A Super I/O")
+	.enable_dev = enable_dev,
+};
diff --git a/src/superio/winbond/w83667hg-a/w83667hg-a.h b/src/superio/winbond/w83667hg-a/w83667hg-a.h
new file mode 100644
index 0000000..efb77b8
--- /dev/null
+++ b/src/superio/winbond/w83667hg-a/w83667hg-a.h
@@ -0,0 +1,47 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2014 Felix Held <felix-coreboot@felixheld.de>
+ * Copyright (C) 2015 Raptor Engineering
+ *
+ * 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 SUPERIO_WINBOND_W83667HG_A
+#define SUPERIO_WINBOND_W83667HG_A
+
+/* Logical Device Numbers (LDN). */
+#define W83667HG_A_FDC		0x00
+#define W83667HG_A_PP		0x01
+#define W83667HG_A_SP1		0x02 /* Com1 */
+#define W83667HG_A_SP2		0x03 /* Com2 */
+#define W83667HG_A_KBC		0x05
+#define W83667HG_A_SPI		0x06
+#define W83667HG_A_GPIO6789_V	0x07
+#define W83667HG_A_WDT1		0x08
+#define W83667HG_A_GPIO2345_V	0x09
+#define W83667HG_A_ACPI		0x0A
+#define W83667HG_A_HWM_TSI	0x0B /* HW monitor/SB-TSI/deep S5 */
+#define W83667HG_A_PECI		0x0C
+#define W83667HG_A_VID_BUSSEL	0x0D /* VID and BUSSEL */
+#define W83667HG_A_GPIO_PP_OD	0x0F /* GPIO Push-Pull/Open drain select */
+
+/* virtual LDN for GPIO */
+#define W83667HG_A_GPIO2		((0 << 8) | W83667HG_A_GPIO2345_V)
+#define W83667HG_A_GPIO3		((1 << 8) | W83667HG_A_GPIO2345_V)
+#define W83667HG_A_GPIO4		((2 << 8) | W83667HG_A_GPIO2345_V)
+#define W83667HG_A_GPIO5		((3 << 8) | W83667HG_A_GPIO2345_V)
+#define W83667HG_A_GPIO6		((1 << 8) | W83667HG_A_GPIO6789_V)
+#define W83667HG_A_GPIO7		((2 << 8) | W83667HG_A_GPIO6789_V)
+#define W83667HG_A_GPIO8		((3 << 8) | W83667HG_A_GPIO6789_V)
+#define W83667HG_A_GPIO9		((4 << 8) | W83667HG_A_GPIO6789_V)
+
+#endif /* SUPERIO_WINBOND_W83667HG_A */
-- 
2.1.4