[coreboot-gerrit] Change in coreboot[master]: acpigen: Add stop gpio control to power resource

Furquan Shaikh (Code Review) gerrit at coreboot.org
Tue Aug 29 02:36:52 CEST 2017


Furquan Shaikh has uploaded this change for review. ( https://review.coreboot.org/21249


Change subject: acpigen: Add stop gpio control to power resource
......................................................................

acpigen: Add stop gpio control to power resource

There is at least one I2C device (being used by Soraka) that has 3
controls -- enable, reset and stop. If the stop gpio is not put into
the right state when turning off the device in suspend mode, then it
causes leakage. Thus, we need control in power resource to be able to
stop the device when entering suspend state.

This change adds stop gpio control only to I2C device since that is
the one known to use it. If a similar need arises for SPI device, stop
gpio can be added to it as well.

BUG=b:64987428
TEST=Verified on soraka that touchscreen stop is correctly configured
on suspend.

Change-Id: Iae5ec7eb3972c5c7f80956d60d0d3c321bbefb0f
Signed-off-by: Furquan Shaikh <furquan at chromium.org>
---
M src/arch/x86/acpi_device.c
M src/arch/x86/include/arch/acpi_device.h
M src/drivers/i2c/generic/chip.h
M src/drivers/i2c/generic/generic.c
M src/drivers/spi/acpi/acpi.c
5 files changed, 26 insertions(+), 6 deletions(-)



  git pull ssh://review.coreboot.org:29418/coreboot refs/changes/49/21249/1

diff --git a/src/arch/x86/acpi_device.c b/src/arch/x86/acpi_device.c
index aac7b88..1110f96 100644
--- a/src/arch/x86/acpi_device.c
+++ b/src/arch/x86/acpi_device.c
@@ -494,13 +494,15 @@
 /* PowerResource() with Enable and/or Reset control */
 void acpi_device_add_power_res(
 	struct acpi_gpio *reset, unsigned int reset_delay_ms,
-	struct acpi_gpio *enable, unsigned int enable_delay_ms)
+	struct acpi_gpio *enable, unsigned int enable_delay_ms,
+	struct acpi_gpio *stop, unsigned int stop_delay_ms)
 {
 	static const char *power_res_dev_states[] = { "_PR0", "_PR3" };
 	unsigned int reset_gpio = reset->pins[0];
 	unsigned int enable_gpio = enable->pins[0];
+	unsigned int stop_gpio = stop->pins[0];
 
-	if (!reset_gpio && !enable_gpio)
+	if (!reset_gpio && !enable_gpio && !stop_gpio)
 		return;
 
 	/* PowerResource (PRIC, 0, 0) */
@@ -524,10 +526,17 @@
 		if (reset_delay_ms)
 			acpigen_write_sleep(reset_delay_ms);
 	}
+	if (stop_gpio) {
+		acpigen_disable_tx_gpio(stop);
+		if (stop_delay_ms)
+			acpigen_write_sleep(stop_delay_ms);
+	}
 	acpigen_pop_len();		/* _ON method */
 
 	/* Method (_OFF, 0, Serialized) */
 	acpigen_write_method_serialized("_OFF", 0);
+	if (stop_gpio)
+		acpigen_enable_tx_gpio(stop);
 	if (reset_gpio)
 		acpigen_enable_tx_gpio(reset);
 	if (enable_gpio)
diff --git a/src/arch/x86/include/arch/acpi_device.h b/src/arch/x86/include/arch/acpi_device.h
index f904cc6..6746086 100644
--- a/src/arch/x86/include/arch/acpi_device.h
+++ b/src/arch/x86/include/arch/acpi_device.h
@@ -284,12 +284,17 @@
 
 /*
  * Add a basic PowerResource block for a device that includes
- * GPIOs for enable and/or reset control of the device.  Each
+ * GPIOs to control enable, reset and stop operation of the device. Each
  * GPIO is optional, but at least one must be provided.
+ *
+ * Reset - Put the device into / take the device out of reset.
+ * Enable - Enable / disable power to device.
+ * Stop - Stop / start operation of device.
  */
 void acpi_device_add_power_res(
 	struct acpi_gpio *reset, unsigned int reset_delay_ms,
-	struct acpi_gpio *enable, unsigned int enable_delay_ms);
+	struct acpi_gpio *enable, unsigned int enable_delay_ms,
+	struct acpi_gpio *stop, unsigned int stop_delay_ms);
 
 /*
  * Writing Device Properties objects via _DSD
diff --git a/src/drivers/i2c/generic/chip.h b/src/drivers/i2c/generic/chip.h
index c5d458b..64b6dbc 100644
--- a/src/drivers/i2c/generic/chip.h
+++ b/src/drivers/i2c/generic/chip.h
@@ -59,6 +59,10 @@
 	struct acpi_gpio enable_gpio;
 	/* Delay to be inserted after device is enabled. */
 	unsigned enable_delay_ms;
+	/* GPIO used to stop operation of device. */
+	struct acpi_gpio stop_gpio;
+	/* Delay to be inserted after stopping the device. */
+	unsigned stop_delay_ms;
 };
 
 /*
diff --git a/src/drivers/i2c/generic/generic.c b/src/drivers/i2c/generic/generic.c
index b7a535e..fed3f88 100644
--- a/src/drivers/i2c/generic/generic.c
+++ b/src/drivers/i2c/generic/generic.c
@@ -141,7 +141,8 @@
 	if (config->has_power_resource)
 		acpi_device_add_power_res(
 			&config->reset_gpio, config->reset_delay_ms,
-			&config->enable_gpio, config->enable_delay_ms);
+			&config->enable_gpio, config->enable_delay_ms,
+			&config->stop_gpio, config->stop_delay_ms);
 
 	/* Callback if any. */
 	if (callback)
diff --git a/src/drivers/spi/acpi/acpi.c b/src/drivers/spi/acpi/acpi.c
index 102780f..2523e20 100644
--- a/src/drivers/spi/acpi/acpi.c
+++ b/src/drivers/spi/acpi/acpi.c
@@ -168,7 +168,8 @@
 	if (config->has_power_resource)
 		acpi_device_add_power_res(
 			&config->reset_gpio, config->reset_delay_ms,
-			&config->enable_gpio, config->enable_delay_ms);
+			&config->enable_gpio, config->enable_delay_ms,
+			NULL, 0);
 
 	acpigen_pop_len(); /* Device */
 	acpigen_pop_len(); /* Scope */

-- 
To view, visit https://review.coreboot.org/21249
To unsubscribe, visit https://review.coreboot.org/settings

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Iae5ec7eb3972c5c7f80956d60d0d3c321bbefb0f
Gerrit-Change-Number: 21249
Gerrit-PatchSet: 1
Gerrit-Owner: Furquan Shaikh <furquan at google.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20170829/721b456f/attachment-0001.html>


More information about the coreboot-gerrit mailing list