Hi maintainers, Could you take another look at this patch? Thanks, Archie On Sat, 10 Oct 2020 at 04:32, Abhishek Pandit-Subedi <abhishekpandit@xxxxxxxxxxxx> wrote: > > Certain controller capabilities must be exposed by the driver because it > can't be queried from HCI (wideband speech support, for example). Update > the match data structure to set the supported capabilities and set the > proper quirks on hdev after registering the device. > > Also update the 8822CS capabilities to show it supports wideband speech > and has valid le states (allows central peripheral role). > > Signed-off-by: Abhishek Pandit-Subedi <abhishekpandit@xxxxxxxxxxxx> > --- > > drivers/bluetooth/hci_h5.c | 53 +++++++++++++++++++++++++++++++------- > 1 file changed, 44 insertions(+), 9 deletions(-) > > diff --git a/drivers/bluetooth/hci_h5.c b/drivers/bluetooth/hci_h5.c > index a10d710fc3f13e..3833a2d276665f 100644 > --- a/drivers/bluetooth/hci_h5.c > +++ b/drivers/bluetooth/hci_h5.c > @@ -97,6 +97,11 @@ struct h5 { > struct gpio_desc *device_wake_gpio; > }; > > +enum h5_capabilities { > + H5_CAP_WIDEBAND_SPEECH = BIT(0), > + H5_CAP_VALID_LE_STATES = BIT(1), > +}; > + > struct h5_vnd { > int (*setup)(struct h5 *h5); > void (*open)(struct h5 *h5); > @@ -106,6 +111,11 @@ struct h5_vnd { > const struct acpi_gpio_mapping *acpi_gpio_map; > }; > > +struct h5_device_data { > + uint32_t capabilities; > + struct h5_vnd *vnd; > +}; > + > static void h5_reset_rx(struct h5 *h5); > > static void h5_link_control(struct hci_uart *hu, const void *data, size_t len) > @@ -791,7 +801,10 @@ static const struct hci_uart_proto h5p = { > static int h5_serdev_probe(struct serdev_device *serdev) > { > struct device *dev = &serdev->dev; > + struct hci_dev *hdev; > struct h5 *h5; > + const struct h5_device_data *data; > + int err; > > h5 = devm_kzalloc(dev, sizeof(*h5), GFP_KERNEL); > if (!h5) > @@ -808,23 +821,21 @@ static int h5_serdev_probe(struct serdev_device *serdev) > if (!match) > return -ENODEV; > > - h5->vnd = (const struct h5_vnd *)match->driver_data; > + data = (const struct h5_device_data *)match->driver_data; > + h5->vnd = data->vnd; > h5->id = (char *)match->id; > > if (h5->vnd->acpi_gpio_map) > devm_acpi_dev_add_driver_gpios(dev, > h5->vnd->acpi_gpio_map); > } else { > - const void *data; > - > data = of_device_get_match_data(dev); > if (!data) > return -ENODEV; > > - h5->vnd = (const struct h5_vnd *)data; > + h5->vnd = data->vnd; > } > > - > h5->enable_gpio = devm_gpiod_get_optional(dev, "enable", GPIOD_OUT_LOW); > if (IS_ERR(h5->enable_gpio)) > return PTR_ERR(h5->enable_gpio); > @@ -834,7 +845,20 @@ static int h5_serdev_probe(struct serdev_device *serdev) > if (IS_ERR(h5->device_wake_gpio)) > return PTR_ERR(h5->device_wake_gpio); > > - return hci_uart_register_device(&h5->serdev_hu, &h5p); > + err = hci_uart_register_device(&h5->serdev_hu, &h5p); > + if (err) > + return err; > + > + hdev = h5->serdev_hu.hdev; > + > + /* Set match specific quirks */ > + if (data->capabilities & H5_CAP_WIDEBAND_SPEECH) > + set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks); > + > + if (data->capabilities & H5_CAP_VALID_LE_STATES) > + set_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks); > + > + return 0; > } > > static void h5_serdev_remove(struct serdev_device *serdev) > @@ -1000,12 +1024,21 @@ static struct h5_vnd rtl_vnd = { > .resume = h5_btrtl_resume, > .acpi_gpio_map = acpi_btrtl_gpios, > }; > + > +static const struct h5_device_data h5_data_rtl8822cs = { > + .capabilities = H5_CAP_WIDEBAND_SPEECH | H5_CAP_VALID_LE_STATES, > + .vnd = &rtl_vnd, > +}; > + > +static const struct h5_device_data h5_data_rtl8723bs = { > + .vnd = &rtl_vnd, > +}; > #endif > > #ifdef CONFIG_ACPI > static const struct acpi_device_id h5_acpi_match[] = { > #ifdef CONFIG_BT_HCIUART_RTL > - { "OBDA8723", (kernel_ulong_t)&rtl_vnd }, > + { "OBDA8723", (kernel_ulong_t)&h5_data_rtl8723bs}, > #endif > { }, > }; > @@ -1019,9 +1052,11 @@ static const struct dev_pm_ops h5_serdev_pm_ops = { > static const struct of_device_id rtl_bluetooth_of_match[] = { > #ifdef CONFIG_BT_HCIUART_RTL > { .compatible = "realtek,rtl8822cs-bt", > - .data = (const void *)&rtl_vnd }, > + .data = &h5_data_rtl8822cs, > + }, > { .compatible = "realtek,rtl8723bs-bt", > - .data = (const void *)&rtl_vnd }, > + .data = &h5_data_rtl8723bs, > + }, > #endif > { }, > }; > -- > 2.28.0.1011.ga647a8990f-goog > > -- > You received this message because you are subscribed to the Google Groups "ChromeOS Bluetooth Upstreaming" group. > To unsubscribe from this group and stop receiving emails from it, send an email to chromeos-bluetooth-upstreaming+unsubscribe@xxxxxxxxxxxx. > To post to this group, send email to chromeos-bluetooth-upstreaming@xxxxxxxxxxxx. > To view this discussion on the web visit https://groups.google.com/a/chromium.org/d/msgid/chromeos-bluetooth-upstreaming/20201009133147.1.Ie792480ac24829a48669e83c0045157eb3d46775%40changeid.