summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/usb/acpi/Makefile.mk1
-rw-r--r--src/drivers/usb/acpi/chip.h3
-rw-r--r--src/drivers/usb/acpi/intel_bluetooth.c194
-rw-r--r--src/drivers/usb/acpi/usb_acpi.c190
4 files changed, 198 insertions, 190 deletions
diff --git a/src/drivers/usb/acpi/Makefile.mk b/src/drivers/usb/acpi/Makefile.mk
index e525b466c9..1bf1435955 100644
--- a/src/drivers/usb/acpi/Makefile.mk
+++ b/src/drivers/usb/acpi/Makefile.mk
@@ -1,3 +1,4 @@
## SPDX-License-Identifier: GPL-2.0-only
ramstage-$(CONFIG_DRIVERS_USB_ACPI) += usb_acpi.c
+ramstage-$(CONFIG_DRIVERS_USB_ACPI) += intel_bluetooth.c
diff --git a/src/drivers/usb/acpi/chip.h b/src/drivers/usb/acpi/chip.h
index 855a5d798b..ad2e3cd485 100644
--- a/src/drivers/usb/acpi/chip.h
+++ b/src/drivers/usb/acpi/chip.h
@@ -86,4 +86,7 @@ struct drivers_usb_acpi_config {
/* Method to get PLD structure from USB device */
bool usb_acpi_get_pld(const struct device *usb_device, struct acpi_pld *pld);
+/* Intel Bluetooth */
+void acpi_device_intel_bt(void);
+
#endif /* __USB_ACPI_CHIP_H__ */
diff --git a/src/drivers/usb/acpi/intel_bluetooth.c b/src/drivers/usb/acpi/intel_bluetooth.c
new file mode 100644
index 0000000000..6cd27f1c81
--- /dev/null
+++ b/src/drivers/usb/acpi/intel_bluetooth.c
@@ -0,0 +1,194 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <acpi/acpigen.h>
+#include "chip.h"
+
+/*
+ * Intel Bluetooth DSM
+ *
+ * Check Tile Activation (2d19d3e1-5708-4696-bd5b-2c3dbae2d6a9)
+ *
+ * Arg2 == 0: Return a package with the following bits set
+ * BIT(0) Indicates whether the device supports other functions
+ * BIT(1) Check Tile Activation
+ *
+ * Check/Set Reset Delay (aa10f4e0-81ac-4233-abf6-3b2ac50e28d9)
+ * Arg2 == 0: Return a package with the following bit set
+ * BIT(0) Indicates whether the device supports other functions
+ * BIT(1) Check Bluetooth reset timing
+ * Arg2 == 1: Set the reset delay based on Arg3
+ */
+
+static void check_reset_delay(void *arg)
+{
+ acpigen_write_if_lequal_op_int(ARG1_OP, 0);
+ {
+ acpigen_write_return_singleton_buffer(0x03);
+ }
+ acpigen_write_else();
+ {
+ acpigen_write_return_singleton_buffer(0x00);
+ }
+ acpigen_pop_len();
+}
+
+static void set_reset_delay(void *arg)
+{
+ acpigen_write_store_op_to_namestr(ARG3_OP, "RDLY");
+}
+
+static void get_feature_flag(void *arg)
+{
+ acpigen_write_if_lequal_op_int(ARG1_OP, 0);
+ {
+ acpigen_write_return_singleton_buffer(0x03);
+ }
+ acpigen_write_else();
+ {
+ acpigen_write_return_singleton_buffer(0x00);
+ }
+ acpigen_pop_len();
+}
+
+void (*uuid_callbacks1[])(void *) = { check_reset_delay, set_reset_delay };
+void (*uuid_callbacks2[])(void *) = { get_feature_flag };
+
+void acpi_device_intel_bt(void)
+{
+/*
+ * Name (RDLY, 0x69)
+ */
+ acpigen_write_name_integer("RDLY", 0x69);
+
+/*
+ * Method (_DSM, 4, Serialized)
+ * {
+ * If ((Arg0 == ToUUID ("aa10f4e0-81ac-4233-abf6-3b2ac50e28d9")))
+ * {
+ * If ((Arg2 == Zero))
+ * {
+ * If ((Arg1 == Zero))
+ * {
+ * Return (Buffer (One)
+ * {
+ * 0x03
+ * })
+ * }
+ * Else
+ * {
+ * Return (Buffer (One)
+ * {
+ * 0x00
+ * })
+ * }
+ * }
+ * If ((Arg2 == One))
+ * {
+ * RDLY = Arg3
+ * }
+ * Return (Zero)
+ * }
+ * ElseIf ((Arg0 == ToUUID ("2d19d3e1-5708-4696-bd5b-2c3dbae2d6a9")))
+ * {
+ * If ((Arg2 == Zero))
+ * {
+ * If ((Arg1 == Zero))
+ * {
+ * Return (Buffer (One)
+ * {
+ * 0x00
+ * })
+ * }
+ * Else
+ * {
+ * Return (Buffer (One)
+ * {
+ * 0x00
+ * })
+ * }
+ * }
+ * Return (Zero)
+ * }
+ * Else
+ * {
+ * Return (Buffer (One)
+ * {
+ * 0x00
+ * })
+ * }
+ * }
+ */
+ struct dsm_uuid uuid_callbacks[] = {
+ DSM_UUID("aa10f4e0-81ac-4233-abf6-3b2ac50e28d9", uuid_callbacks1, 2, NULL),
+ DSM_UUID("2d19d3e1-5708-4696-bd5b-2c3dbae2d6a9", uuid_callbacks2, 1, NULL),
+ };
+
+ acpigen_write_dsm_uuid_arr(uuid_callbacks, ARRAY_SIZE(uuid_callbacks));
+/*
+ * PowerResource (BTRT, 0x05, 0x0000)
+ * {
+ * Method (_STA, 0, NotSerialized)
+ * {
+ * Return (One)
+ * }
+ * Method (_ON, 0, NotSerialized)
+ * {
+ * }
+ * Method (_OFF, 0, NotSerialized)
+ * {
+ * }
+ * Method (_RST, 0, NotSerialized)
+ * {
+ * Local0 = Acquire (CNMT, 0x03E8)
+ * If ((Local0 == Zero))
+ * {
+ * BTRK (Zero)
+ * Sleep (RDLY)
+ * BTRK (One)
+ * Sleep (RDLY)
+ * }
+ * Release (CNMT)
+ * }
+ * }
+ */
+ acpigen_write_power_res("BTRT", 5, 0, NULL, 0);
+ {
+ acpigen_write_method("_STA", 0);
+ {
+ acpigen_write_return_integer(1);
+ }
+ acpigen_pop_len();
+
+ acpigen_write_method("_ON", 0);
+ acpigen_pop_len();
+
+ acpigen_write_method("_OFF", 0);
+ acpigen_pop_len();
+
+ acpigen_write_method("_RST", 0);
+ {
+ acpigen_write_store();
+ acpigen_write_acquire("CNMT", 0x03e8);
+ acpigen_emit_byte(LOCAL0_OP);
+
+ acpigen_write_if_lequal_op_int(LOCAL0_OP, 0);
+ {
+ acpigen_emit_namestring("BTRK");
+ acpigen_emit_byte(0);
+
+ acpigen_emit_ext_op(SLEEP_OP);
+ acpigen_emit_namestring("RDLY");
+
+ acpigen_emit_namestring("BTRK");
+ acpigen_emit_byte(1);
+
+ acpigen_emit_ext_op(SLEEP_OP);
+ acpigen_emit_namestring("RDLY");
+ }
+ acpigen_pop_len();
+ acpigen_write_release("CNMT");
+ }
+ acpigen_pop_len();
+ }
+ acpigen_write_power_res_end();
+}
diff --git a/src/drivers/usb/acpi/usb_acpi.c b/src/drivers/usb/acpi/usb_acpi.c
index 3a9db30dbf..1fb6368852 100644
--- a/src/drivers/usb/acpi/usb_acpi.c
+++ b/src/drivers/usb/acpi/usb_acpi.c
@@ -8,196 +8,6 @@
#include <device/device.h>
#include "chip.h"
-/*
- * Intel Bluetooth DSM
- *
- * Check Tile Activation (2d19d3e1-5708-4696-bd5b-2c3dbae2d6a9)
- *
- * Arg2 == 0: Return a package with the following bits set
- * BIT(0) Indicates whether the device supports other functions
- * BIT(1) Check Tile Activation
- *
- * Check/Set Reset Delay (aa10f4e0-81ac-4233-abf6-3b2ac50e28d9)
- * Arg2 == 0: Return a package with the following bit set
- * BIT(0) Indicates whether the device supports other functions
- * BIT(1) Check Bluetooth reset timing
- * Arg2 == 1: Set the reset delay based on Arg3
- */
-
-static void check_reset_delay(void *arg)
-{
- acpigen_write_if_lequal_op_int(ARG1_OP, 0);
- {
- acpigen_write_return_singleton_buffer(0x03);
- }
- acpigen_write_else();
- {
- acpigen_write_return_singleton_buffer(0x00);
- }
- acpigen_pop_len();
-}
-
-static void set_reset_delay(void *arg)
-{
- acpigen_write_store_op_to_namestr(ARG3_OP, "RDLY");
-}
-
-static void get_feature_flag(void *arg)
-{
- acpigen_write_if_lequal_op_int(ARG1_OP, 0);
- {
- acpigen_write_return_singleton_buffer(0x03);
- }
- acpigen_write_else();
- {
- acpigen_write_return_singleton_buffer(0x00);
- }
- acpigen_pop_len();
-}
-
-void (*uuid_callbacks1[])(void *) = { check_reset_delay, set_reset_delay };
-void (*uuid_callbacks2[])(void *) = { get_feature_flag };
-
-static void acpi_device_intel_bt(void)
-{
-/*
- * Name (RDLY, 0x69)
- */
- acpigen_write_name_integer("RDLY", 0x69);
-
-/*
- * Method (_DSM, 4, Serialized)
- * {
- * If ((Arg0 == ToUUID ("aa10f4e0-81ac-4233-abf6-3b2ac50e28d9")))
- * {
- * If ((Arg2 == Zero))
- * {
- * If ((Arg1 == Zero))
- * {
- * Return (Buffer (One)
- * {
- * 0x03
- * })
- * }
- * Else
- * {
- * Return (Buffer (One)
- * {
- * 0x00
- * })
- * }
- * }
- * If ((Arg2 == One))
- * {
- * RDLY = Arg3
- * }
- * Return (Zero)
- * }
- * ElseIf ((Arg0 == ToUUID ("2d19d3e1-5708-4696-bd5b-2c3dbae2d6a9")))
- * {
- * If ((Arg2 == Zero))
- * {
- * If ((Arg1 == Zero))
- * {
- * Return (Buffer (One)
- * {
- * 0x00
- * })
- * }
- * Else
- * {
- * Return (Buffer (One)
- * {
- * 0x00
- * })
- * }
- * }
- * Return (Zero)
- * }
- * Else
- * {
- * Return (Buffer (One)
- * {
- * 0x00
- * })
- * }
- * }
- */
- struct dsm_uuid uuid_callbacks[] = {
- DSM_UUID("aa10f4e0-81ac-4233-abf6-3b2ac50e28d9", uuid_callbacks1, 2, NULL),
- DSM_UUID("2d19d3e1-5708-4696-bd5b-2c3dbae2d6a9", uuid_callbacks2, 1, NULL),
- };
-
- acpigen_write_dsm_uuid_arr(uuid_callbacks, ARRAY_SIZE(uuid_callbacks));
-/*
- * PowerResource (BTRT, 0x05, 0x0000)
- * {
- * Method (_STA, 0, NotSerialized)
- * {
- * Return (One)
- * }
- * Method (_ON, 0, NotSerialized)
- * {
- * }
- * Method (_OFF, 0, NotSerialized)
- * {
- * }
- * Method (_RST, 0, NotSerialized)
- * {
- * Local0 = Acquire (CNMT, 0x03E8)
- * If ((Local0 == Zero))
- * {
- * BTRK (Zero)
- * Sleep (RDLY)
- * BTRK (One)
- * Sleep (RDLY)
- * }
- * Release (CNMT)
- * }
- * }
- */
- acpigen_write_power_res("BTRT", 5, 0, NULL, 0);
- {
- acpigen_write_method("_STA", 0);
- {
- acpigen_write_return_integer(1);
- }
- acpigen_pop_len();
-
- acpigen_write_method("_ON", 0);
- acpigen_pop_len();
-
- acpigen_write_method("_OFF", 0);
- acpigen_pop_len();
-
- acpigen_write_method("_RST", 0);
- {
- acpigen_write_store();
- acpigen_write_acquire("CNMT", 0x03e8);
- acpigen_emit_byte(LOCAL0_OP);
-
- acpigen_write_if_lequal_op_int(LOCAL0_OP, 0);
- {
- acpigen_emit_namestring("BTRK");
- acpigen_emit_byte(0);
-
- acpigen_emit_ext_op(SLEEP_OP);
- acpigen_emit_namestring("RDLY");
-
- acpigen_emit_namestring("BTRK");
- acpigen_emit_byte(1);
-
- acpigen_emit_ext_op(SLEEP_OP);
- acpigen_emit_namestring("RDLY");
- }
- acpigen_pop_len();
- acpigen_write_release("CNMT");
- }
- acpigen_pop_len();
- }
- acpigen_write_power_res_end();
-}
-
static bool usb_acpi_add_gpios_to_crs(struct drivers_usb_acpi_config *cfg)
{
if (cfg->privacy_gpio.pin_count)