The hci_h5 already supports rtl8723bs devices discovered via ACPI. This commit adds support for discovering via device tree for ACPI-less platforms. Signed-off-by: Hugo Grostabussiat <bonstra@xxxxxxxxxxxxxxxxx> --- drivers/bluetooth/hci_h5.c | 40 +++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/drivers/bluetooth/hci_h5.c b/drivers/bluetooth/hci_h5.c index dacf297baf59..49ac03b1a7e3 100644 --- a/drivers/bluetooth/hci_h5.c +++ b/drivers/bluetooth/hci_h5.c @@ -11,6 +11,7 @@ #include <linux/gpio/consumer.h> #include <linux/kernel.h> #include <linux/mod_devicetable.h> +#include <linux/of_device.h> #include <linux/serdev.h> #include <linux/skbuff.h> @@ -782,7 +783,9 @@ static const struct hci_uart_proto h5p = { static int h5_serdev_probe(struct serdev_device *serdev) { - const struct acpi_device_id *match; + const struct acpi_device_id *acpi_match; + const struct of_device_id *of_match; + const char *cfgname = NULL; struct device *dev = &serdev->dev; struct h5 *h5; @@ -797,16 +800,27 @@ static int h5_serdev_probe(struct serdev_device *serdev) serdev_device_set_drvdata(serdev, h5); if (has_acpi_companion(dev)) { - match = acpi_match_device(dev->driver->acpi_match_table, dev); - if (!match) + acpi_match = acpi_match_device( + dev->driver->acpi_match_table, dev); + if (!acpi_match) return -ENODEV; - h5->vnd = (const struct h5_vnd *)match->driver_data; - h5->id = (char *)match->id; + h5->vnd = (const struct h5_vnd *)acpi_match->driver_data; + h5->id = (char *)acpi_match->id; if (h5->vnd->acpi_gpio_map) devm_acpi_dev_add_driver_gpios(dev, h5->vnd->acpi_gpio_map); + } else if (dev->of_node) { + of_match = of_match_device(dev->driver->of_match_table, dev); + if (!of_match) + return -ENODEV; + + of_property_read_string(dev->of_node, + "realtek,config-name", &cfgname); + + h5->vnd = (const struct h5_vnd *)of_match->data; + h5->id = cfgname; } h5->enable_gpio = devm_gpiod_get_optional(dev, "enable", GPIOD_OUT_LOW); @@ -996,6 +1010,19 @@ static const struct acpi_device_id h5_acpi_match[] = { MODULE_DEVICE_TABLE(acpi, h5_acpi_match); #endif +#ifdef CONFIG_OF +static const struct of_device_id h5_of_match[] = { +#ifdef CONFIG_BT_HCIUART_RTL + { + .compatible = "realtek,rtl8723bs-bt", + .data = &rtl_vnd + }, +#endif + { }, +}; +MODULE_DEVICE_TABLE(of, h5_of_match); +#endif + static const struct dev_pm_ops h5_serdev_pm_ops = { SET_SYSTEM_SLEEP_PM_OPS(h5_serdev_suspend, h5_serdev_resume) }; @@ -1006,6 +1033,9 @@ static struct serdev_device_driver h5_serdev_driver = { .driver = { .name = "hci_uart_h5", .acpi_match_table = ACPI_PTR(h5_acpi_match), +#ifdef CONFIG_OF + .of_match_table = h5_of_match, +#endif .pm = &h5_serdev_pm_ops, }, }; -- 2.23.0