[coreboot-gerrit] Patch set updated for coreboot: 177a446 rambi: Add ACPI table support for I2C devices

Aaron Durbin (adurbin@google.com) gerrit at coreboot.org
Wed May 14 15:57:28 CEST 2014


Aaron Durbin (adurbin at google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/5045

-gerrit

commit 177a4464e98a3e3db52eac457b4265dca3756c0a
Author: Duncan Laurie <dlaurie at chromium.org>
Date:   Mon Jan 13 10:15:12 2014 -0800

    rambi: Add ACPI table support for I2C devices
    
    In order to support probing I2C devices when the controller is
    in ACPI mode the mainboard needs to decalre them in the proper
    scope with the address/interrupt information.  The touchpad devices
    are ATML0000/ELAN0000 and the touchscreen is ATML0001 so they can
    be distinguished in userland scripts based on ID.  There is also
    a special "ISTP" node that indicates whether the devices is a
    touchpad (=1) or touchscreen (=0) in case this is useful to drivers.
    
    These names may not be final but they are a starting point and can
    be easily changed.
    
    Atmel devices also have a bootloader mode which needs to be
    declared as a separate device.  Unfortunately it does not work as
    expected to have multiple I2cSerialBus() resources declared in a
    single device and have it select properly, even with the use of
    StartDependentFn(), so bootloader devices are declared separately.
    
    The original devices are left in \_SB scope and are only enabled
    if the I2C controllers are in PCI mode.  The new devices are only
    enabled if the I2C controllers are in ACPI mode.
    
    BUG=chrome-os-partner:24380
    BRANCH=baytrail
    TEST=manual
    
    1) Ensure there is no change in functionality by default and that
    the devices are still probed by chromeos_laptop in the kernel.
    2) Enable lpss_acpi_mode=1 in devicetree.cb and kernel changes to
    add _HID entries for devices in appropriate drivers.  Ensure that
    the devices are probed successfully.  Further changes are needed
    to the chromeos-touch-firmware scripts to load config and update
    firmware based on the new ACPI _HID entries.
    3) Put touchpad in bootloader mode (by flashing bad firmware) and
    ensure that it is detected at address 0x25 and the firmware is
    able to be updated.
    
    Change-Id: I5b9b47ddc94474a677497271e963f62cb09438e0
    Signed-off-by: Duncan Laurie <dlaurie at chromium.org>
    Reviewed-on: https://chromium-review.googlesource.com/182259
    Reviewed-by: Aaron Durbin <adurbin at chromium.org>
    Signed-off-by: Aaron Durbin <adurbin at chromium.org>
---
 src/mainboard/google/rambi/acpi/mainboard.asl | 226 +++++++++++++++++++++++---
 src/mainboard/google/rambi/dsdt.asl           |   5 +-
 2 files changed, 202 insertions(+), 29 deletions(-)

diff --git a/src/mainboard/google/rambi/acpi/mainboard.asl b/src/mainboard/google/rambi/acpi/mainboard.asl
index 696d1aa..9b16272 100644
--- a/src/mainboard/google/rambi/acpi/mainboard.asl
+++ b/src/mainboard/google/rambi/acpi/mainboard.asl
@@ -40,71 +40,243 @@ Scope (\_SB)
 
 	Device (TPAD)
 	{
-		Name (_ADR, 0x0)
+		Name (_HID, EisaId ("PNP0C0E"))
 		Name (_UID, 1)
 
-		// Report as a Sleep Button device so Linux will
-		// automatically enable it as a wake source
-		Name (_HID, EisaId("PNP0C0E"))
-
 		Name (_CRS, ResourceTemplate()
 		{
 			Interrupt (ResourceConsumer, Edge, ActiveLow)
 			{
 				BOARD_TRACKPAD_IRQ
 			}
+		})
+
+		Method (_STA)
+		{
+			/* Disable if I2C1 is in ACPI mode */
+			If (LEqual (\S1EN, 1)) {
+				Return (0x0)
+			} Else {
+				Return (0xF)
+			}
+		}
 
-			VendorShort (ADDR)
+		Name (_PRW, Package() { BOARD_TRACKPAD_WAKE_GPIO, 0x3 })
+	}
+
+	Device (TSCR)
+	{
+		Name (_HID, EisaId ("PNP0C0E"))
+		Name (_UID, 2)
+
+		Name (_CRS, ResourceTemplate()
+		{
+			Interrupt (ResourceConsumer, Edge, ActiveLow)
 			{
-				BOARD_TRACKPAD_I2C_ADDR
+				BOARD_TOUCHSCREEN_IRQ
 			}
 		})
 
-		Name (_PRW, Package() { BOARD_TRACKPAD_WAKE_GPIO, 0x3 })
+		Method (_STA)
+		{
+			/* Disable if I2C6 is in ACPI mode */
+			If (LEqual (\S6EN, 1)) {
+				Return (0x0)
+			} Else {
+				Return (0xF)
+			}
+		}
+
+		Name (_PRW, Package() { BOARD_TOUCHSCREEN_WAKE_GPIO, 0x3 })
+	}
+}
+
+Scope (\_SB.I2C1)
+{
+	Device (ATPB)
+	{
+		Name (_HID, "ATML0000")
+		Name (_DDN, "Atmel Touchpad Bootloader")
+		Name (_UID, 1)
+		Name (ISTP, 1) /* Touchpad */
 
-		Method (_DSW, 3, NotSerialized)
+		Name (_CRS, ResourceTemplate()
 		{
-			Store (BOARD_TRACKPAD_WAKE_GPIO, Local0)
+			I2cSerialBus (
+				0x25,                     // SlaveAddress
+				ControllerInitiated,      // SlaveMode
+				400000,                   // ConnectionSpeed
+				AddressingMode7Bit,       // AddressingMode
+				"\_SB.I2C1",              // ResourceSource
+			)
+			Interrupt (ResourceConsumer, Edge, ActiveLow)
+			{
+				BOARD_TRACKPAD_IRQ
+			}
+		})
 
-			If (LEqual (Arg0, 1)) {
-				// Enable GPIO as wake source
-				// \_SB.PCI0.LPCB.GWAK (Local0)
+		Method (_STA)
+		{
+			If (LEqual (\S1EN, 1)) {
+				Return (0xF)
+			} Else {
+				Return (0x0)
 			}
 		}
+
+		/* Allow device to power off in S0 */
+		Name (_S0W, 4)
 	}
 
-	Device (TSCR)
+	Device (ATPA)
 	{
-		Name (_ADR, 0x0)
+		Name (_HID, "ATML0000")
+		Name (_CID, EisaId ("PNP0C0E"))
+		Name (_DDN, "Atmel Touchpad")
 		Name (_UID, 2)
+		Name (ISTP, 1) /* Touchpad */
+
+		Name (_CRS, ResourceTemplate()
+		{
+			I2cSerialBus (
+				0x4b,                     // SlaveAddress
+				ControllerInitiated,      // SlaveMode
+				400000,                   // ConnectionSpeed
+				AddressingMode7Bit,       // AddressingMode
+				"\_SB.I2C1",              // ResourceSource
+			)
+			Interrupt (ResourceConsumer, Edge, ActiveLow)
+			{
+				BOARD_TRACKPAD_IRQ
+			}
+		})
 
-		// Report as a Sleep Button device so Linux will
-		// automatically enable it as a wake source
-		Name (_HID, EisaId("PNP0C0E"))
+		Method (_STA)
+		{
+			If (LEqual (\S1EN, 1)) {
+				Return (0xF)
+			} Else {
+				Return (0x0)
+			}
+		}
+
+		/* Allow device to power off in S0 */
+		Name (_S0W, 4)
+
+		Name (_PRW, Package() { BOARD_TRACKPAD_WAKE_GPIO, 0x3 })
+	}
+
+	Device (ETPA)
+	{
+		Name (_HID, "ELAN0000")
+		Name (_CID, EisaId ("PNP0C0E"))
+		Name (_DDN, "Elan Touchpad")
+		Name (_UID, 3)
+		Name (ISTP, 1) /* Touchpad */
 
 		Name (_CRS, ResourceTemplate()
 		{
+			I2cSerialBus (
+				0x15,                     // SlaveAddress
+				ControllerInitiated,      // SlaveMode
+				400000,                   // ConnectionSpeed
+				AddressingMode7Bit,       // AddressingMode
+				"\_SB.I2C1",              // ResourceSource
+			)
 			Interrupt (ResourceConsumer, Edge, ActiveLow)
 			{
-				BOARD_TOUCHSCREEN_IRQ
+				BOARD_TRACKPAD_IRQ
 			}
+		})
+
+		Method (_STA)
+		{
+			If (LEqual (\S1EN, 1)) {
+				Return (0xF)
+			} Else {
+				Return (0x0)
+			}
+		}
+
+		/* Allow device to power off in S0 */
+		Name (_S0W, 4)
+
+		Name (_PRW, Package() { BOARD_TRACKPAD_WAKE_GPIO, 0x3 })
+	}
+}
+
+Scope (\_SB.I2C6)
+{
+	Device (ATSB)
+	{
+		Name (_HID, "ATML0001")
+		Name (_DDN, "Atmel Touchscreen Bootloader")
+		Name (_UID, 4)
+		Name (ISTP, 0) /* TouchScreen */
 
-			VendorShort (ADDR)
+		Name (_CRS, ResourceTemplate()
+		{
+			I2cSerialBus (
+				0x26,                     // SlaveAddress
+				ControllerInitiated,      // SlaveMode
+				400000,                   // ConnectionSpeed
+				AddressingMode7Bit,       // AddressingMode
+				"\_SB.I2C6",              // ResourceSource
+			)
+			Interrupt (ResourceConsumer, Edge, ActiveLow)
 			{
-				BOARD_TOUCHSCREEN_I2C_ADDR
+				BOARD_TOUCHSCREEN_IRQ
 			}
 		})
 
-		Name (_PRW, Package() { BOARD_TOUCHSCREEN_WAKE_GPIO, 0x3 })
+		Method (_STA)
+		{
+			If (LEqual (\S6EN, 1)) {
+				Return (0xF)
+			} Else {
+				Return (0x0)
+			}
+		}
 
-		Method (_DSW, 3, NotSerialized)
+		/* Allow device to power off in S0 */
+		Name (_S0W, 4)
+	}
+
+	Device (ATSA)
+	{
+		Name (_HID, "ATML0001")
+		Name (_CID, EisaId ("PNP0C0E"))
+		Name (_DDN, "Atmel Touchscreen")
+		Name (_UID, 5)
+		Name (ISTP, 0) /* TouchScreen */
+
+		Name (_CRS, ResourceTemplate()
 		{
-			Store (BOARD_TOUCHSCREEN_WAKE_GPIO, Local0)
+			I2cSerialBus (
+				0x4a,                     // SlaveAddress
+				ControllerInitiated,      // SlaveMode
+				400000,                   // ConnectionSpeed
+				AddressingMode7Bit,       // AddressingMode
+				"\_SB.I2C6",              // ResourceSource
+			)
+			Interrupt (ResourceConsumer, Edge, ActiveLow)
+			{
+				BOARD_TOUCHSCREEN_IRQ
+			}
+		})
 
-			If (LEqual (Arg0, 1)) {
-				// Enable GPIO as wake source
-				// \_SB.PCI0.LPCB.GWAK (Local0)
+		Method (_STA)
+		{
+			If (LEqual (\S6EN, 1)) {
+				Return (0xF)
+			} Else {
+				Return (0x0)
 			}
 		}
+
+		/* Allow device to power off in S0 */
+		Name (_S0W, 4)
+
+		Name (_PRW, Package() { BOARD_TOUCHSCREEN_WAKE_GPIO, 0x3 })
 	}
 }
diff --git a/src/mainboard/google/rambi/dsdt.asl b/src/mainboard/google/rambi/dsdt.asl
index 53f2922..4165087 100644
--- a/src/mainboard/google/rambi/dsdt.asl
+++ b/src/mainboard/google/rambi/dsdt.asl
@@ -23,7 +23,7 @@
 DefinitionBlock(
 	"dsdt.aml",
 	"DSDT",
-	0x02,		// DSDT revision: ACPI v2.0
+	0x05,		// DSDT revision: ACPI v5.0
 	"COREv4",	// OEM id
 	"COREBOOT",	// OEM table id
 	0x20110725	// OEM revision
@@ -31,7 +31,6 @@ DefinitionBlock(
 {
 	// Some generic macros
 	#include <soc/intel/baytrail/acpi/platform.asl>
-	#include "acpi/mainboard.asl"
 
 	// global NVS and variables
 	#include <soc/intel/baytrail/acpi/globalnvs.asl>
@@ -56,4 +55,6 @@ DefinitionBlock(
 
 	/* Chipset specific sleep states */
 	#include <soc/intel/baytrail/acpi/sleepstates.asl>
+
+	#include "acpi/mainboard.asl"
 }



More information about the coreboot-gerrit mailing list