<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(¶ms->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(¶ms->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(¶ms->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(¶ms->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(¶ms->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(¶ms->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(¶ms->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>