Hi Hugo, > 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)) { then move const struct acpi_device_id *match here in the local focus. > - 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) { And have struct of_device_id *match here. > + 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; So we can not just read a realtek specific variable here. This is still generic code for 3-Wire UART protocol and needs to be available to other vendors as well. > } > > 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 Use of_match_ptr here instead of the ifdef. > .pm = &h5_serdev_pm_ops, > }, > }; Regards Marcel