diff options
Diffstat (limited to 'src/mainboard/google/zork/variants/baseboard/ramstage_common.c')
-rw-r--r-- | src/mainboard/google/zork/variants/baseboard/ramstage_common.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/mainboard/google/zork/variants/baseboard/ramstage_common.c b/src/mainboard/google/zork/variants/baseboard/ramstage_common.c index 511d60d0b8..b2c5830d10 100644 --- a/src/mainboard/google/zork/variants/baseboard/ramstage_common.c +++ b/src/mainboard/google/zork/variants/baseboard/ramstage_common.c @@ -2,7 +2,10 @@ #include <acpi/acpi_device.h> #include <baseboard/variants.h> +#include <console/console.h> +#include <device/device.h> #include <drivers/amd/i2s_machine_dev/chip.h> +#include <drivers/usb/acpi/chip.h> #include <ec/google/chromeec/ec.h> #include <soc/gpio.h> #include <soc/pci_devs.h> @@ -47,3 +50,88 @@ void variant_audio_update(void) break; } } + +static const struct device_path xhci0_bt_path[] = { + { + .type = DEVICE_PATH_PCI, + .pci.devfn = PCIE_GPP_A_DEVFN + }, + { + .type = DEVICE_PATH_PCI, + .pci.devfn = XHCI0_DEVFN + }, + { + .type = DEVICE_PATH_USB, + .usb.port_type = 0, + .usb.port_id = 0 + }, + { + .type = DEVICE_PATH_USB, + .usb.port_type = 2, + .usb.port_id = 5 + } +}; + +static const struct device_path xhci1_bt_path[] = { + { + .type = DEVICE_PATH_PCI, + .pci.devfn = PCIE_GPP_A_DEVFN + }, + { + .type = DEVICE_PATH_PCI, + .pci.devfn = XHCI1_DEVFN + }, + { + .type = DEVICE_PATH_USB, + .usb.port_type = 0, + .usb.port_id = 0 + }, + { + .type = DEVICE_PATH_USB, + .usb.port_type = 2, + .usb.port_id = 1 + } +}; + +/* + * Removes reset_gpio from bluetooth device in device tree. + * + * The bluetooth device may be on XHCI0 or XHCI1 depending on SOC. + * There's no harm in removing from both here. + */ +static void baseboard_remove_bluetooth_reset_gpio(void) +{ + const struct device *xhci0_bt_dev, *xhci1_bt_dev; + struct drivers_usb_acpi_config *xhci0_bt_cfg, *xhci1_bt_cfg; + + xhci0_bt_dev = find_dev_nested_path( + pci_root_bus(), xhci0_bt_path, ARRAY_SIZE(xhci0_bt_path)); + if (!xhci0_bt_dev) { + printk(BIOS_ERR, "%s: Failed to find bluetooth device on XHCI0!", __func__); + return; + } + /* config_of dies on failure, so a NULL check is not required */ + xhci0_bt_cfg = config_of(xhci0_bt_dev); + xhci0_bt_cfg->reset_gpio.pin_count = 0; + + /* There's no bluetooth device on XHCI1 on Dalboz */ + if (CONFIG(BOARD_GOOGLE_BASEBOARD_DALBOZ)) + return; + + xhci1_bt_dev = find_dev_nested_path( + pci_root_bus(), xhci1_bt_path, ARRAY_SIZE(xhci1_bt_path)); + if (!xhci1_bt_dev) { + printk(BIOS_ERR, "%s: Failed to find bluetooth device on XHCI1!", __func__); + return; + } + xhci1_bt_cfg = config_of(xhci1_bt_dev); + xhci1_bt_cfg->reset_gpio.pin_count = 0; +} + +void variant_bluetooth_update(void) +{ + if (CONFIG(BOARD_GOOGLE_BASEBOARD_DALBOZ) || variant_uses_v3_schematics()) + return; + + baseboard_remove_bluetooth_reset_gpio(); +} |