summaryrefslogtreecommitdiff
path: root/src/drivers/usb
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/usb')
-rw-r--r--src/drivers/usb/acpi/chip.h14
-rw-r--r--src/drivers/usb/acpi/usb_acpi.c20
2 files changed, 32 insertions, 2 deletions
diff --git a/src/drivers/usb/acpi/chip.h b/src/drivers/usb/acpi/chip.h
index 8cd926888d..8afdf6fc8e 100644
--- a/src/drivers/usb/acpi/chip.h
+++ b/src/drivers/usb/acpi/chip.h
@@ -44,7 +44,21 @@ struct drivers_usb_acpi_config {
bool use_custom_pld;
struct acpi_pld custom_pld;
+ /* Does the device have a power resource? */
+ bool has_power_resource;
+
+ /* GPIO used to take device out of reset or to put it into reset. */
struct acpi_gpio reset_gpio;
+ /* Delay to be inserted after device is taken out of reset. */
+ unsigned int reset_delay_ms;
+ /* Delay to be inserted after device is put into reset. */
+ unsigned int reset_off_delay_ms;
+ /* GPIO used to enable device. */
+ struct acpi_gpio enable_gpio;
+ /* Delay to be inserted after device is enabled. */
+ unsigned int enable_delay_ms;
+ /* Delay to be inserted after device is disabled. */
+ unsigned int enable_off_delay_ms;
};
#endif /* __USB_ACPI_CHIP_H__ */
diff --git a/src/drivers/usb/acpi/usb_acpi.c b/src/drivers/usb/acpi/usb_acpi.c
index 55ef1d361f..8a597e3e9e 100644
--- a/src/drivers/usb/acpi/usb_acpi.c
+++ b/src/drivers/usb/acpi/usb_acpi.c
@@ -11,9 +11,10 @@
static bool usb_acpi_add_gpios_to_crs(struct drivers_usb_acpi_config *cfg)
{
/*
- * Return false if reset GPIO is not provided.
+ * Return false if reset GPIO is not provided or is provided as part of power
+ * resource.
*/
- if (cfg->reset_gpio.pin_count == 0)
+ if (cfg->has_power_resource || cfg->reset_gpio.pin_count == 0)
return false;
return true;
@@ -61,6 +62,21 @@ static void usb_acpi_fill_ssdt_generator(const struct device *dev)
acpi_dp_write(dsd);
}
+ if (config->has_power_resource) {
+ const struct acpi_power_res_params power_res_params = {
+ &config->reset_gpio,
+ config->reset_delay_ms,
+ config->reset_off_delay_ms,
+ &config->enable_gpio,
+ config->enable_delay_ms,
+ config->enable_off_delay_ms,
+ NULL,
+ 0,
+ 0
+ };
+ acpi_device_add_power_res(&power_res_params);
+ }
+
acpigen_pop_len();
printk(BIOS_INFO, "%s: %s at %s\n", path,