<p>Shelley Chen has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/25882">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">src/drivers: Add reset/enable/stop_off_ms variables to ACPI devices<br><br>Some touchscreens need to adhere to certain timings during the power<br>off sequence as well as during the power on sequence.  Adding<br>reset_off_delay_ms, enable_off_delay_ms, and stop_off_delay_ms to<br>accommodate these devices.<br><br>BUG=b:78311818<br>BRANCH=None<br>TEST=./util/abuild/abuild -p none -t google/poppy -x -a<br><br>Change-Id: Idb4a5dbe56eee4749d2f2b514e92c28fb2c6078f<br>Signed-off-by: Shelley Chen <shchen@google.com><br>---<br>M src/arch/x86/acpi_device.c<br>M src/arch/x86/include/arch/acpi_device.h<br>M src/drivers/i2c/generic/chip.h<br>M src/drivers/i2c/generic/generic.c<br>M src/drivers/spi/acpi/acpi.c<br>M src/drivers/spi/acpi/chip.h<br>6 files changed, 98 insertions(+), 43 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/82/25882/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/arch/x86/acpi_device.c b/src/arch/x86/acpi_device.c</span><br><span>index 31e59ea..af4deca 100644</span><br><span>--- a/src/arch/x86/acpi_device.c</span><br><span>+++ b/src/arch/x86/acpi_device.c</span><br><span>@@ -469,15 +469,12 @@</span><br><span> }</span><br><span> </span><br><span> /* PowerResource() with Enable and/or Reset control */</span><br><span style="color: hsl(0, 100%, 40%);">-void acpi_device_add_power_res(</span><br><span style="color: hsl(0, 100%, 40%);">-     struct acpi_gpio *reset, unsigned int reset_delay_ms,</span><br><span style="color: hsl(0, 100%, 40%);">-   struct acpi_gpio *enable, unsigned int enable_delay_ms,</span><br><span style="color: hsl(0, 100%, 40%);">- struct acpi_gpio *stop, unsigned int stop_delay_ms)</span><br><span style="color: hsl(120, 100%, 40%);">+void acpi_device_add_power_res(struct acpi_power_res_params *params)</span><br><span> {</span><br><span>       static const char *power_res_dev_states[] = { "_PR0", "_PR3" };</span><br><span style="color: hsl(0, 100%, 40%);">-     unsigned int reset_gpio = reset->pins[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    unsigned int enable_gpio = enable->pins[0];</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned int stop_gpio = stop->pins[0];</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned int reset_gpio = params->reset_gpio.pins[0];</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int enable_gpio = params->enable_gpio.pins[0];</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned int stop_gpio = params->stop_gpio.pins[0];</span><br><span> </span><br><span>   if (!reset_gpio && !enable_gpio && !stop_gpio)</span><br><span>               return;</span><br><span>@@ -492,32 +489,41 @@</span><br><span>      /* Method (_ON, 0, Serialized) */</span><br><span>    acpigen_write_method_serialized("_ON", 0);</span><br><span>         if (reset_gpio)</span><br><span style="color: hsl(0, 100%, 40%);">-         acpigen_enable_tx_gpio(reset);</span><br><span style="color: hsl(120, 100%, 40%);">+                acpigen_enable_tx_gpio(&params->reset_gpio);</span><br><span>  if (enable_gpio) {</span><br><span style="color: hsl(0, 100%, 40%);">-              acpigen_enable_tx_gpio(enable);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (enable_delay_ms)</span><br><span style="color: hsl(0, 100%, 40%);">-                    acpigen_write_sleep(enable_delay_ms);</span><br><span style="color: hsl(120, 100%, 40%);">+         acpigen_enable_tx_gpio(&params->enable_gpio);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (params->enable_delay_ms)</span><br><span style="color: hsl(120, 100%, 40%);">+                       acpigen_write_sleep(params->enable_delay_ms);</span><br><span>     }</span><br><span>    if (reset_gpio) {</span><br><span style="color: hsl(0, 100%, 40%);">-               acpigen_disable_tx_gpio(reset);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (reset_delay_ms)</span><br><span style="color: hsl(0, 100%, 40%);">-                     acpigen_write_sleep(reset_delay_ms);</span><br><span style="color: hsl(120, 100%, 40%);">+          acpigen_disable_tx_gpio(&params->reset_gpio);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (params->reset_delay_ms)</span><br><span style="color: hsl(120, 100%, 40%);">+                        acpigen_write_sleep(params->reset_delay_ms);</span><br><span>      }</span><br><span>    if (stop_gpio) {</span><br><span style="color: hsl(0, 100%, 40%);">-                acpigen_disable_tx_gpio(stop);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (stop_delay_ms)</span><br><span style="color: hsl(0, 100%, 40%);">-                      acpigen_write_sleep(stop_delay_ms);</span><br><span style="color: hsl(120, 100%, 40%);">+           acpigen_disable_tx_gpio(&params->stop_gpio);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (params->stop_delay_ms)</span><br><span style="color: hsl(120, 100%, 40%);">+                 acpigen_write_sleep(params->stop_delay_ms);</span><br><span>       }</span><br><span>    acpigen_pop_len();              /* _ON method */</span><br><span> </span><br><span>         /* Method (_OFF, 0, Serialized) */</span><br><span>   acpigen_write_method_serialized("_OFF", 0);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (stop_gpio)</span><br><span style="color: hsl(0, 100%, 40%);">-          acpigen_enable_tx_gpio(stop);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (reset_gpio)</span><br><span style="color: hsl(0, 100%, 40%);">-         acpigen_enable_tx_gpio(reset);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (enable_gpio)</span><br><span style="color: hsl(0, 100%, 40%);">-                acpigen_disable_tx_gpio(enable);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (stop_gpio) {</span><br><span style="color: hsl(120, 100%, 40%);">+              acpigen_enable_tx_gpio(&params->stop_gpio);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (params->stop_off_delay_ms)</span><br><span style="color: hsl(120, 100%, 40%);">+                     acpigen_write_sleep(params->stop_off_delay_ms);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (reset_gpio) {</span><br><span style="color: hsl(120, 100%, 40%);">+             acpigen_enable_tx_gpio(&params->reset_gpio);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (params->reset_off_delay_ms)</span><br><span style="color: hsl(120, 100%, 40%);">+                    acpigen_write_sleep(params->reset_off_delay_ms);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (enable_gpio) {</span><br><span style="color: hsl(120, 100%, 40%);">+            acpigen_disable_tx_gpio(&params->enable_gpio);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (params->enable_off_delay_ms)</span><br><span style="color: hsl(120, 100%, 40%);">+                   acpigen_write_sleep(params->enable_off_delay_ms);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span>    acpigen_pop_len();              /* _OFF method */</span><br><span> </span><br><span>        acpigen_pop_len();              /* PowerResource PRIC */</span><br><span>diff --git a/src/arch/x86/include/arch/acpi_device.h b/src/arch/x86/include/arch/acpi_device.h</span><br><span>index 4361c74..33dbcff 100644</span><br><span>--- a/src/arch/x86/include/arch/acpi_device.h</span><br><span>+++ b/src/arch/x86/include/arch/acpi_device.h</span><br><span>@@ -315,6 +315,28 @@</span><br><span> /* Write SPI Bus descriptor to SSDT AML output */</span><br><span> void acpi_device_write_spi(const struct acpi_spi *spi);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* GPIO/timing information for the power on/off sequences */</span><br><span style="color: hsl(120, 100%, 40%);">+struct acpi_power_res_params {</span><br><span style="color: hsl(120, 100%, 40%);">+    /* GPIO used to take device out of reset or to put it into reset. */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct acpi_gpio reset_gpio;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Delay to be inserted after device is taken out of reset. */</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned int reset_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Delay to be inserted after device is put into reset. */</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned int reset_off_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* GPIO used to enable device. */</span><br><span style="color: hsl(120, 100%, 40%);">+     struct acpi_gpio enable_gpio;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Delay to be inserted after device is enabled. */</span><br><span style="color: hsl(120, 100%, 40%);">+   unsigned int enable_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Delay to be inserted after device is disabled. */</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned int enable_off_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* GPIO used to stop operation of device. */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct acpi_gpio stop_gpio;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Delay to be inserted after disabling stop. */</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int stop_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Delay to be inserted after enabling stop. */</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int stop_off_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*</span><br><span>  * Add a basic PowerResource block for a device that includes</span><br><span>  * GPIOs to control enable, reset and stop operation of the device. Each</span><br><span>@@ -324,10 +346,7 @@</span><br><span>  * Enable - Enable / disable power to device.</span><br><span>  * Stop - Stop / start operation of device.</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-void acpi_device_add_power_res(</span><br><span style="color: hsl(0, 100%, 40%);">-   struct acpi_gpio *reset, unsigned int reset_delay_ms,</span><br><span style="color: hsl(0, 100%, 40%);">-   struct acpi_gpio *enable, unsigned int enable_delay_ms,</span><br><span style="color: hsl(0, 100%, 40%);">- struct acpi_gpio *stop, unsigned int stop_delay_ms);</span><br><span style="color: hsl(120, 100%, 40%);">+void acpi_device_add_power_res(struct acpi_power_res_params *params);</span><br><span> </span><br><span> /*</span><br><span>  * Writing Device Properties objects via _DSD</span><br><span>diff --git a/src/drivers/i2c/generic/chip.h b/src/drivers/i2c/generic/chip.h</span><br><span>index 037a800..2495e7c 100644</span><br><span>--- a/src/drivers/i2c/generic/chip.h</span><br><span>+++ b/src/drivers/i2c/generic/chip.h</span><br><span>@@ -56,15 +56,21 @@</span><br><span>    /* GPIO used to take device out of reset or to put it into reset. */</span><br><span>         struct acpi_gpio reset_gpio;</span><br><span>         /* Delay to be inserted after device is taken out of reset. */</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned reset_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int reset_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Delay to be inserted after device is put into reset. */</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned int reset_off_delay_ms;</span><br><span>     /* GPIO used to enable device. */</span><br><span>    struct acpi_gpio enable_gpio;</span><br><span>        /* Delay to be inserted after device is enabled. */</span><br><span style="color: hsl(0, 100%, 40%);">-     unsigned enable_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+     unsigned int enable_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Delay to be inserted after device is disabled. */</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned int enable_off_delay_ms;</span><br><span>    /* GPIO used to stop operation of device. */</span><br><span>         struct acpi_gpio stop_gpio;</span><br><span>  /* Delay to be inserted after disabling stop. */</span><br><span style="color: hsl(0, 100%, 40%);">-        unsigned stop_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int stop_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Delay to be inserted after enabling stop. */</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int stop_off_delay_ms;</span><br><span> </span><br><span>  /* Generic properties for exporting device-specific data to the OS */</span><br><span>        struct acpi_dp property_list[MAX_GENERIC_PROPERTY_LIST];</span><br><span>diff --git a/src/drivers/i2c/generic/generic.c b/src/drivers/i2c/generic/generic.c</span><br><span>index 13f8393..fe30f65 100644</span><br><span>--- a/src/drivers/i2c/generic/generic.c</span><br><span>+++ b/src/drivers/i2c/generic/generic.c</span><br><span>@@ -142,11 +142,20 @@</span><br><span>    }</span><br><span> </span><br><span>        /* Power Resource */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (config->has_power_resource)</span><br><span style="color: hsl(0, 100%, 40%);">-              acpi_device_add_power_res(</span><br><span style="color: hsl(0, 100%, 40%);">-                      &config->reset_gpio, config->reset_delay_ms,</span><br><span style="color: hsl(0, 100%, 40%);">-                  &config->enable_gpio, config->enable_delay_ms,</span><br><span style="color: hsl(0, 100%, 40%);">-                        &config->stop_gpio, config->stop_delay_ms);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (config->has_power_resource) {</span><br><span style="color: hsl(120, 100%, 40%);">+          struct acpi_power_res_params power_res_params = {</span><br><span style="color: hsl(120, 100%, 40%);">+                     config->reset_gpio,</span><br><span style="color: hsl(120, 100%, 40%);">+                        config->reset_delay_ms,</span><br><span style="color: hsl(120, 100%, 40%);">+                    config->reset_off_delay_ms,</span><br><span style="color: hsl(120, 100%, 40%);">+                        config->enable_gpio,</span><br><span style="color: hsl(120, 100%, 40%);">+                       config->enable_delay_ms,</span><br><span style="color: hsl(120, 100%, 40%);">+                   config->enable_off_delay_ms,</span><br><span style="color: hsl(120, 100%, 40%);">+                       config->stop_gpio,</span><br><span style="color: hsl(120, 100%, 40%);">+                 config->stop_delay_ms,</span><br><span style="color: hsl(120, 100%, 40%);">+                     config->stop_off_delay_ms</span><br><span style="color: hsl(120, 100%, 40%);">+          };</span><br><span style="color: hsl(120, 100%, 40%);">+            acpi_device_add_power_res(&power_res_params);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> </span><br><span>        /* Callback if any. */</span><br><span>       if (callback)</span><br><span>diff --git a/src/drivers/spi/acpi/acpi.c b/src/drivers/spi/acpi/acpi.c</span><br><span>index d36a03a..4b16799 100644</span><br><span>--- a/src/drivers/spi/acpi/acpi.c</span><br><span>+++ b/src/drivers/spi/acpi/acpi.c</span><br><span>@@ -165,11 +165,20 @@</span><br><span>       }</span><br><span> </span><br><span>        /* Power Resource */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (config->has_power_resource)</span><br><span style="color: hsl(0, 100%, 40%);">-              acpi_device_add_power_res(</span><br><span style="color: hsl(0, 100%, 40%);">-                      &config->reset_gpio, config->reset_delay_ms,</span><br><span style="color: hsl(0, 100%, 40%);">-                  &config->enable_gpio, config->enable_delay_ms,</span><br><span style="color: hsl(0, 100%, 40%);">-                        &config->stop_gpio, config->stop_delay_ms);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (config->has_power_resource) {</span><br><span style="color: hsl(120, 100%, 40%);">+          struct acpi_power_res_params power_res_params = {</span><br><span style="color: hsl(120, 100%, 40%);">+                     config->reset_gpio,</span><br><span style="color: hsl(120, 100%, 40%);">+                        config->reset_delay_ms,</span><br><span style="color: hsl(120, 100%, 40%);">+                    config->reset_off_delay_ms,</span><br><span style="color: hsl(120, 100%, 40%);">+                        config->enable_gpio,</span><br><span style="color: hsl(120, 100%, 40%);">+                       config->enable_delay_ms,</span><br><span style="color: hsl(120, 100%, 40%);">+                   config->enable_off_delay_ms,</span><br><span style="color: hsl(120, 100%, 40%);">+                       config->stop_gpio,</span><br><span style="color: hsl(120, 100%, 40%);">+                 config->stop_delay_ms,</span><br><span style="color: hsl(120, 100%, 40%);">+                     config->stop_off_delay_ms</span><br><span style="color: hsl(120, 100%, 40%);">+          };</span><br><span style="color: hsl(120, 100%, 40%);">+            acpi_device_add_power_res(&power_res_params);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> </span><br><span>        acpigen_pop_len(); /* Device */</span><br><span>      acpigen_pop_len(); /* Scope */</span><br><span>diff --git a/src/drivers/spi/acpi/chip.h b/src/drivers/spi/acpi/chip.h</span><br><span>index 35341d3..fa7d8a1 100644</span><br><span>--- a/src/drivers/spi/acpi/chip.h</span><br><span>+++ b/src/drivers/spi/acpi/chip.h</span><br><span>@@ -41,17 +41,23 @@</span><br><span>        /* GPIO used to take device out of reset or to put it into reset. */</span><br><span>         struct acpi_gpio reset_gpio;</span><br><span>         /* Delay to be inserted after device is taken out of reset. */</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned reset_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int reset_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Delay to be inserted after device is put into reset. */</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned int reset_off_delay_ms;</span><br><span> </span><br><span>         /* GPIO used to enable device. */</span><br><span>    struct acpi_gpio enable_gpio;</span><br><span>        /* Delay to be inserted after device is enabled. */</span><br><span style="color: hsl(0, 100%, 40%);">-     unsigned enable_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+     unsigned int enable_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Delay to be inserted after device is disabled. */</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned int enable_off_delay_ms;</span><br><span> </span><br><span>        /* GPIO used to stop operation of device. */</span><br><span>         struct acpi_gpio stop_gpio;</span><br><span>  /* Delay to be inserted after disabling stop. */</span><br><span style="color: hsl(0, 100%, 40%);">-        unsigned stop_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int stop_delay_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Delay to be inserted after enabling stop. */</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int stop_off_delay_ms;</span><br><span> };</span><br><span> </span><br><span> #endif /* __SPI_ACPI_CHIP_H__ */</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/25882">change 25882</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/25882"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Idb4a5dbe56eee4749d2f2b514e92c28fb2c6078f </div>
<div style="display:none"> Gerrit-Change-Number: 25882 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Shelley Chen <shchen@google.com> </div>