diff --git a/src/drivers/usb/acpi/chip.h b/src/drivers/usb/acpi/chip.h index 73c69cc89f..41481f1c87 100644 --- a/src/drivers/usb/acpi/chip.h +++ b/src/drivers/usb/acpi/chip.h @@ -68,4 +68,7 @@ struct drivers_usb_acpi_config { struct acpi_gpio privacy_gpio; }; +/* Method to get PLD structure from USB device */ +bool usb_acpi_get_pld(const struct device *usb_device, struct acpi_pld *pld); + #endif /* __USB_ACPI_CHIP_H__ */ diff --git a/src/drivers/usb/acpi/usb_acpi.c b/src/drivers/usb/acpi/usb_acpi.c index 9d68d0a923..a0dadff861 100644 --- a/src/drivers/usb/acpi/usb_acpi.c +++ b/src/drivers/usb/acpi/usb_acpi.c @@ -37,6 +37,7 @@ static void usb_acpi_fill_ssdt_generator(const struct device *dev) { struct drivers_usb_acpi_config *config = dev->chip_info; const char *path = acpi_device_path(dev); + struct acpi_pld pld; if (!path || !config) return; @@ -50,15 +51,10 @@ static void usb_acpi_fill_ssdt_generator(const struct device *dev) acpigen_write_name_string("_DDN", config->desc); acpigen_write_upc(config->type); - if (config->use_custom_pld) { - /* Use board defined PLD */ - acpigen_write_pld(&config->custom_pld); - } else { - /* Fill PLD strucutre based on port type */ - struct acpi_pld pld; - acpi_pld_fill_usb(&pld, config->type, &config->group); + if (usb_acpi_get_pld(dev, &pld)) acpigen_write_pld(&pld); - } + else + printk(BIOS_ERR, "Error retrieving PLD for %s\n", path); /* Resources */ if (usb_acpi_add_gpios_to_crs(config) == true) { @@ -126,3 +122,19 @@ struct chip_operations drivers_usb_acpi_ops = { CHIP_NAME("USB ACPI Device") .enable_dev = usb_acpi_enable }; + +bool usb_acpi_get_pld(const struct device *usb_device, struct acpi_pld *pld) +{ + struct drivers_usb_acpi_config *config = usb_device->chip_info; + + if (!usb_device || !usb_device->chip_info || + usb_device->chip_ops != &drivers_usb_acpi_ops) + return false; + + if (config->use_custom_pld) + memcpy(pld, &config->custom_pld, sizeof(pld)); + else + acpi_pld_fill_usb(pld, config->type, &config->group); + + return true; +}