Add new ec subdir for Embedded Controllers and common ACPI EC support

Adds a new src/ec subdir for embedded controllers (mostly found in laptops)
and converts Getac P470 and Roda RK886EX to use the new ACPI EC instead
of having their own copies of those functions.

Signed-off-by: Sven Schnelle <svens@stackframe.org>
Acked-by: Peter Stuge <peter@stuge.se>


git-svn-id: svn://svn.coreboot.org/coreboot/trunk@6304 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
diff --git a/Makefile b/Makefile
index a41efd0..0a834c7 100644
--- a/Makefile
+++ b/Makefile
@@ -123,7 +123,7 @@
 PLATFORM-y += src/arch/$(ARCHDIR-y) src/cpu src/mainboard/$(MAINBOARDDIR)
 TARGETS-y :=
 
-BUILD-y := src/lib src/boot src/console src/devices src/southbridge src/northbridge src/superio src/drivers
+BUILD-y := src/lib src/boot src/console src/devices src/ec src/southbridge src/northbridge src/superio src/drivers
 BUILD-y += util/cbfstool util/sconfig
 BUILD-$(CONFIG_ARCH_X86) += src/pc80
 
diff --git a/src/Kconfig b/src/Kconfig
index 77546b0..28915b2 100644
--- a/src/Kconfig
+++ b/src/Kconfig
@@ -124,6 +124,8 @@
 source src/superio/Kconfig
 comment "Devices"
 source src/devices/Kconfig
+comment "Embedded Controllers"
+source src/ec/Kconfig
 
 endmenu
 
diff --git a/src/ec/Kconfig b/src/ec/Kconfig
new file mode 100644
index 0000000..9408f6b
--- /dev/null
+++ b/src/ec/Kconfig
@@ -0,0 +1 @@
+source src/ec/acpi/Kconfig
diff --git a/src/ec/Makefile.inc b/src/ec/Makefile.inc
new file mode 100644
index 0000000..20d71ab
--- /dev/null
+++ b/src/ec/Makefile.inc
@@ -0,0 +1 @@
+subdirs-y += acpi
diff --git a/src/ec/acpi/Kconfig b/src/ec/acpi/Kconfig
new file mode 100644
index 0000000..642f178
--- /dev/null
+++ b/src/ec/acpi/Kconfig
@@ -0,0 +1,4 @@
+config EC_ACPI
+	bool
+	help
+	ACPI Embedded Controller interface. Mostly found in laptops.
diff --git a/src/ec/acpi/Makefile.inc b/src/ec/acpi/Makefile.inc
new file mode 100644
index 0000000..34c5136
--- /dev/null
+++ b/src/ec/acpi/Makefile.inc
@@ -0,0 +1,2 @@
+ramstage-y += ec.c
+smm-$(CONFIG_HAVE_SMI_HANDLER) += ec.c
diff --git a/src/mainboard/roda/rk886ex/ec.c b/src/ec/acpi/ec.c
similarity index 95%
rename from src/mainboard/roda/rk886ex/ec.c
rename to src/ec/acpi/ec.c
index 4c39a84..7a01b7e 100644
--- a/src/mainboard/roda/rk886ex/ec.c
+++ b/src/ec/acpi/ec.c
@@ -20,6 +20,7 @@
  */
 
 #include <console/console.h>
+#include <device/device.h>
 #include <arch/io.h>
 #include <delay.h>
 #include "ec.h"
@@ -112,3 +113,6 @@
 	return send_ec_data(data);
 }
 
+struct chip_operations ec_acpi_ops = {
+	CHIP_NAME("ACPI Embedded Controller")
+};
diff --git a/src/mainboard/roda/rk886ex/ec.h b/src/ec/acpi/ec.h
similarity index 96%
rename from src/mainboard/roda/rk886ex/ec.h
rename to src/ec/acpi/ec.h
index 49b7491..77ee637 100644
--- a/src/mainboard/roda/rk886ex/ec.h
+++ b/src/ec/acpi/ec.h
@@ -17,8 +17,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#ifndef _MAINBOARD_EC_H
-#define _MAINBOARD_EC_H
+#ifndef _EC_ACPI_H
+#define _EC_ACPI_H
 
 #define EC_DATA	0x62
 #define EC_SC	0x66
diff --git a/src/mainboard/getac/p470/Kconfig b/src/mainboard/getac/p470/Kconfig
index f531a51..e4e8292 100644
--- a/src/mainboard/getac/p470/Kconfig
+++ b/src/mainboard/getac/p470/Kconfig
@@ -27,6 +27,7 @@
 	select SOUTHBRIDGE_TI_PCIXX12
 	select SUPERIO_SMSC_FDC37N972
 	select SUPERIO_SMSC_SIO10N268
+	select EC_ACPI
 	select BOARD_HAS_FADT
 	select HAVE_ACPI_TABLES
 	select HAVE_PIRQ_TABLE
diff --git a/src/mainboard/getac/p470/devicetree.cb b/src/mainboard/getac/p470/devicetree.cb
index 2929cbe..9b376c7 100644
--- a/src/mainboard/getac/p470/devicetree.cb
+++ b/src/mainboard/getac/p470/devicetree.cb
@@ -135,6 +135,8 @@
 					end
 					device pnp 4e.b off		# HWM
 					end
+					chip ec/acpi
+					end
                                 end
 
                         end
diff --git a/src/mainboard/getac/p470/ec.c b/src/mainboard/getac/p470/ec.c
deleted file mode 100644
index 2fe44af..0000000
--- a/src/mainboard/getac/p470/ec.c
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2008-2009 coresystems GmbH
- *
- * 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; version 2 of
- * the License.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-
-#include <console/console.h>
-#include <arch/io.h>
-#include <delay.h>
-#include "ec.h"
-
-int send_ec_command(u8 command)
-{
-	int timeout;
-
-	timeout = 0x7ff;
-	while ((inb(EC_SC) & EC_IBF) && --timeout) {
-		udelay(10);
-		if ((timeout & 0xff) == 0)
-			printk(BIOS_SPEW, ".");
-	}
-	if (!timeout) {
-		printk(BIOS_DEBUG, "Timeout while sending command 0x%02x to EC!\n", 
-				command);
-		// return -1;
-	}
-
-	outb(command, EC_SC);
-	return 0;
-}
-
-int send_ec_data(u8 data)
-{
-	int timeout;
-
-	timeout = 0x7ff;
-	while ((inb(EC_SC) & EC_IBF) && --timeout) { // wait for IBF = 0
-		udelay(10);
-		if ((timeout & 0xff) == 0)
-			printk(BIOS_SPEW, ".");
-	}
-	if (!timeout) {
-		printk(BIOS_DEBUG, "Timeout while sending data 0x%02x to EC!\n",
-				data);
-		// return -1;
-	}
-
-	outb(data, EC_DATA);
-
-	return 0;
-}
-
-int send_ec_data_nowait(u8 data)
-{
-	outb(data, EC_DATA);
-
-	return 0;
-}
-
-u8 recv_ec_data(void)
-{
-	int timeout;
-	u8 data;
-
-	timeout = 0x7fff;
-	while (--timeout) { // Wait for OBF = 1
-		if (inb(EC_SC) & EC_OBF) {
-			break;
-		}
-		udelay(10);
-		if ((timeout & 0xff) == 0)
-			printk(BIOS_SPEW, ".");
-	}
-	if (!timeout) {
-		printk(BIOS_DEBUG, "\nTimeout while receiving data from EC!\n");
-		// return -1;
-	}
-
-	data = inb(EC_DATA);
-	printk(BIOS_SPEW, "recv_ec_data: 0x%02x\n", data);
-
-	return data;
-}
-
-u8 ec_read(u8 addr)
-{
-	send_ec_command(0x80);
-	send_ec_data(addr);
-
-	return recv_ec_data();
-}
-
-int ec_write(u8 addr, u8 data)
-{
-	send_ec_command(0x81);
-	send_ec_data(addr);
-	return send_ec_data(data);
-}
-
-int ec_dump_status(void)
-{
-	u8 ec_sc = inb(EC_SC);
-	printk(BIOS_DEBUG, "Embedded Controller Status: ");
-	if (ec_sc & (1 << 6)) printk(BIOS_DEBUG, "SMI_EVT ");
-	if (ec_sc & (1 << 5)) printk(BIOS_DEBUG, "SCI_EVT ");
-	if (ec_sc & (1 << 4)) printk(BIOS_DEBUG, "BURST ");
-	if (ec_sc & (1 << 3)) printk(BIOS_DEBUG, "CMD ");
-	if (ec_sc & (1 << 1)) printk(BIOS_DEBUG, "IBF ");
-	if (ec_sc & (1 << 0)) printk(BIOS_DEBUG, "OBF ");
-	printk(BIOS_DEBUG, "\n");
-	
-	return ec_sc;
-}
-
-
-/* ********************************** */
-
-int send_ec_oem_command(u8 command)
-{
-	int timeout;
-
-	timeout = 0x7ff;
-	while ((inb(EC_OEM_SC) & EC_IBF) && --timeout) {
-		udelay(10);
-		if ((timeout & 0xff) == 0)
-			printk(BIOS_SPEW, ".");
-	}
-	if (!timeout) {
-		printk(BIOS_DEBUG, "Timeout while sending OEM command 0x%02x to EC!\n", 
-				command);
-		// return -1;
-	}
-
-	outb(command, EC_OEM_SC);
-	return 0;
-}
-
-int send_ec_oem_data(u8 data)
-{
-	int timeout;
-
-	timeout = 0x7ff;
-	while ((inb(EC_OEM_SC) & EC_IBF) && --timeout) { // wait for IBF = 0
-		udelay(10);
-		if ((timeout & 0xff) == 0)
-			printk(BIOS_SPEW, ".");
-	}
-	if (!timeout) {
-		printk(BIOS_DEBUG, "Timeout while sending OEM data 0x%02x to EC!\n",
-				data);
-		// return -1;
-	}
-
-	outb(data, EC_OEM_DATA);
-
-	return 0;
-}
-
-int send_ec_oem_data_nowait(u8 data)
-{
-	outb(data, EC_OEM_DATA);
-
-	return 0;
-}
-
-u8 recv_ec_oem_data(void)
-{
-	int timeout;
-	u8 data;
-
-	timeout = 0x7fff;
-	while (--timeout) { // Wait for OBF = 1
-		if (inb(EC_OEM_SC) & EC_OBF) {
-			break;
-		}
-		udelay(10);
-		if ((timeout & 0xff) == 0)
-			printk(BIOS_SPEW, ".");
-	}
-	if (!timeout) {
-		printk(BIOS_DEBUG, "\nTimeout while receiving OEM data from EC!\n");
-		// return -1;
-	}
-
-	data = inb(EC_OEM_DATA);
-	// printk(BIOS_SPEW, "recv_ec_oem_data: 0x%02x\n", data);
-
-	return data;
-}
-
-u8 ec_oem_read(u8 addr)
-{
-	send_ec_oem_command(0x80);
-	send_ec_oem_data(addr);
-
-	return recv_ec_oem_data();
-}
-
-int ec_oem_write(u8 addr, u8 data)
-{
-	send_ec_oem_command(0x81);
-	send_ec_oem_data(addr);
-	return send_ec_oem_data(data);
-}
-
-int ec_oem_dump_status(void)
-{
-	u8 ec_sc = inb(EC_OEM_SC);
-	printk(BIOS_DEBUG, "Embedded Controller Status: ");
-	if (ec_sc & (1 << 6)) printk(BIOS_DEBUG, "SMI_EVT ");
-	if (ec_sc & (1 << 5)) printk(BIOS_DEBUG, "SCI_EVT ");
-	if (ec_sc & (1 << 4)) printk(BIOS_DEBUG, "BURST ");
-	if (ec_sc & (1 << 3)) printk(BIOS_DEBUG, "CMD ");
-	if (ec_sc & (1 << 1)) printk(BIOS_DEBUG, "IBF ");
-	if (ec_sc & (1 << 0)) printk(BIOS_DEBUG, "OBF ");
-	printk(BIOS_DEBUG, "\n");
-	
-	return ec_sc;
-}
-
diff --git a/src/mainboard/getac/p470/ec_oem.c b/src/mainboard/getac/p470/ec_oem.c
new file mode 100644
index 0000000..30d4135
--- /dev/null
+++ b/src/mainboard/getac/p470/ec_oem.c
@@ -0,0 +1,130 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2008-2009 coresystems GmbH
+ *
+ * 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; version 2 of
+ * the License.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include <console/console.h>
+#include <arch/io.h>
+#include <delay.h>
+#include <ec/acpi/ec.h>
+#include "ec_oem.h"
+
+int send_ec_oem_command(u8 command)
+{
+	int timeout;
+
+	timeout = 0x7ff;
+	while ((inb(EC_OEM_SC) & EC_IBF) && --timeout) {
+		udelay(10);
+		if ((timeout & 0xff) == 0)
+			printk(BIOS_SPEW, ".");
+	}
+	if (!timeout) {
+		printk(BIOS_DEBUG, "Timeout while sending OEM command 0x%02x to EC!\n", 
+				command);
+		// return -1;
+	}
+
+	outb(command, EC_OEM_SC);
+	return 0;
+}
+
+int send_ec_oem_data(u8 data)
+{
+	int timeout;
+
+	timeout = 0x7ff;
+	while ((inb(EC_OEM_SC) & EC_IBF) && --timeout) { // wait for IBF = 0
+		udelay(10);
+		if ((timeout & 0xff) == 0)
+			printk(BIOS_SPEW, ".");
+	}
+	if (!timeout) {
+		printk(BIOS_DEBUG, "Timeout while sending OEM data 0x%02x to EC!\n",
+				data);
+		// return -1;
+	}
+
+	outb(data, EC_OEM_DATA);
+
+	return 0;
+}
+
+int send_ec_oem_data_nowait(u8 data)
+{
+	outb(data, EC_OEM_DATA);
+
+	return 0;
+}
+
+u8 recv_ec_oem_data(void)
+{
+	int timeout;
+	u8 data;
+
+	timeout = 0x7fff;
+	while (--timeout) { // Wait for OBF = 1
+		if (inb(EC_OEM_SC) & EC_OBF) {
+			break;
+		}
+		udelay(10);
+		if ((timeout & 0xff) == 0)
+			printk(BIOS_SPEW, ".");
+	}
+	if (!timeout) {
+		printk(BIOS_DEBUG, "\nTimeout while receiving OEM data from EC!\n");
+		// return -1;
+	}
+
+	data = inb(EC_OEM_DATA);
+	// printk(BIOS_SPEW, "recv_ec_oem_data: 0x%02x\n", data);
+
+	return data;
+}
+
+u8 ec_oem_read(u8 addr)
+{
+	send_ec_oem_command(0x80);
+	send_ec_oem_data(addr);
+
+	return recv_ec_oem_data();
+}
+
+int ec_oem_write(u8 addr, u8 data)
+{
+	send_ec_oem_command(0x81);
+	send_ec_oem_data(addr);
+	return send_ec_oem_data(data);
+}
+
+int ec_oem_dump_status(void)
+{
+	u8 ec_sc = inb(EC_OEM_SC);
+	printk(BIOS_DEBUG, "Embedded Controller Status: ");
+	if (ec_sc & (1 << 6)) printk(BIOS_DEBUG, "SMI_EVT ");
+	if (ec_sc & (1 << 5)) printk(BIOS_DEBUG, "SCI_EVT ");
+	if (ec_sc & (1 << 4)) printk(BIOS_DEBUG, "BURST ");
+	if (ec_sc & (1 << 3)) printk(BIOS_DEBUG, "CMD ");
+	if (ec_sc & (1 << 1)) printk(BIOS_DEBUG, "IBF ");
+	if (ec_sc & (1 << 0)) printk(BIOS_DEBUG, "OBF ");
+	printk(BIOS_DEBUG, "\n");
+	
+	return ec_sc;
+}
+
diff --git a/src/mainboard/getac/p470/ec.h b/src/mainboard/getac/p470/ec_oem.h
similarity index 87%
rename from src/mainboard/getac/p470/ec.h
rename to src/mainboard/getac/p470/ec_oem.h
index 1fe21e5..14f7484 100644
--- a/src/mainboard/getac/p470/ec.h
+++ b/src/mainboard/getac/p470/ec_oem.h
@@ -19,12 +19,8 @@
  * MA 02110-1301 USA
  */
 
-#ifndef _MAINBOARD_EC_H
-#define _MAINBOARD_EC_H
-
-#define EC_DATA	0x62
-#define EC_SC	0x66
-
+#ifndef _MAINBOARD_EC_OEM_H
+#define _MAINBOARD_EC_OEM_H
 
 #define EC_OEM_DATA	0x68
 #define EC_OEM_SC	0x6c
@@ -44,13 +40,6 @@
 #define   BD_EC 	0x83 // Burst Disable Embedded Controller
 #define   QR_EC 	0x84 // Query Embedded Controller
 
-int send_ec_command(u8 command);
-int send_ec_data(u8 data);
-int send_ec_data_nowait(u8 data);
-u8 recv_ec_data(void);
-u8 ec_read(u8 addr);
-int ec_write(u8 addr, u8 data);
-
 int send_ec_oem_command(u8 command);
 int send_ec_oem_data(u8 data);
 int send_ec_oem_data_nowait(u8 data);
diff --git a/src/mainboard/getac/p470/mainboard.c b/src/mainboard/getac/p470/mainboard.c
index a861f43..8f8a395 100644
--- a/src/mainboard/getac/p470/mainboard.c
+++ b/src/mainboard/getac/p470/mainboard.c
@@ -28,7 +28,7 @@
 #include "chip.h"
 #include "hda_verb.h"
 
-#include "ec.c"
+#include "ec_oem.c"
 
 #define MAX_LCD_BRIGHTNESS	0xd8
 
diff --git a/src/mainboard/getac/p470/mainboard_smi.c b/src/mainboard/getac/p470/mainboard_smi.c
index 47dd3bc..d29fe58 100644
--- a/src/mainboard/getac/p470/mainboard_smi.c
+++ b/src/mainboard/getac/p470/mainboard_smi.c
@@ -25,7 +25,8 @@
 #include <cpu/x86/smm.h>
 #include "southbridge/intel/i82801gx/i82801gx.h"
 #include "southbridge/intel/i82801gx/nvs.h"
-#include "ec.c"
+#include <ec/acpi/ec.h>
+#include "ec_oem.c"
 
 #define MAX_LCD_BRIGHTNESS 0xd8
 
diff --git a/src/mainboard/roda/rk886ex/Makefile.inc b/src/mainboard/roda/rk886ex/Makefile.inc
index e36824c..549654a 100644
--- a/src/mainboard/roda/rk886ex/Makefile.inc
+++ b/src/mainboard/roda/rk886ex/Makefile.inc
@@ -18,7 +18,6 @@
 ##
 
 ramstage-y += m3885.c
-ramstage-y += ec.c
 driver-y += rtl8168.c
 
 smm-$(CONFIG_HAVE_SMI_HANDLER) += mainboard_smi.c
diff --git a/src/mainboard/roda/rk886ex/devicetree.cb b/src/mainboard/roda/rk886ex/devicetree.cb
index a139e25..a713331 100644
--- a/src/mainboard/roda/rk886ex/devicetree.cb
+++ b/src/mainboard/roda/rk886ex/devicetree.cb
@@ -106,6 +106,8 @@
 					device pnp ff.1 on # dummy address
 					end
 				end
+				chip ec/acpi
+				end
 
                         end
 			#device pci 1f.1 off end # IDE
diff --git a/src/mainboard/roda/rk886ex/m3885.c b/src/mainboard/roda/rk886ex/m3885.c
index 5173ecf..29d12bc 100644
--- a/src/mainboard/roda/rk886ex/m3885.c
+++ b/src/mainboard/roda/rk886ex/m3885.c
@@ -25,7 +25,7 @@
 #include <arch/io.h>
 #include <delay.h>
 
-#include "ec.h"
+#include <ec/acpi/ec.h>
 #include "m3885.h"
 
 #define TH0LOW	80
diff --git a/src/mainboard/roda/rk886ex/mainboard.c b/src/mainboard/roda/rk886ex/mainboard.c
index f444e0a..2c5b5e3 100644
--- a/src/mainboard/roda/rk886ex/mainboard.c
+++ b/src/mainboard/roda/rk886ex/mainboard.c
@@ -30,7 +30,7 @@
 #include <arch/coreboot_tables.h>
 #include "chip.h"
 
-#include "ec.h"
+#include <ec/acpi/ec.h>
 #include "m3885.h"
 
 #define DUMP_RUNTIME_REGISTERS 0