While adding support for the BCM4354, I discovered a few more things
that weren't working as they should have.
First, we disallow serdev from setting the baudrate on BCM4354. Serdev
sets the oper_speed first before calling hu->setup() in
hci_uart_setup(). On the BCM4354, this results in bcm_setup() failing
when the hci reset times out.
Next, we add support for setting the PCM parameters, which consists of
a pair of vendor specific opcodes to set the pcm parameters. The
documentation for these params are available in the brcm_patchram_plus
package (i.e. https://github.com/balena-os/brcm_patchram_plus). This is
necessary for PCM to work properly.
All changes were tested with rk3288-veyron-minnie.dts.
Changes in v2:
- Use match data to disallow baudrate setting
- Parse pcm parameters by name instead of as a byte string
- Fix prefix for dt-bindings commit
Abhishek Pandit-Subedi (4):
Bluetooth: hci_bcm: Disallow set_baudrate for BCM4354
Bluetooth: btbcm: Support pcm configuration
Bluetooth: hci_bcm: Support pcm params in dts
dt-bindings: net: broadcom-bluetooth: Add pcm config
.../bindings/net/broadcom-bluetooth.txt | 11 ++++
drivers/bluetooth/btbcm.c | 35 +++++++++++
drivers/bluetooth/btbcm.h | 10 ++++
drivers/bluetooth/hci_bcm.c | 58 ++++++++++++++++++-
4 files changed, 112 insertions(+), 2 deletions(-)
--
2.24.0.rc1.363.gb1bccd3e3d-goog
Add BCM vendor specific commands to configure PCM.
Signed-off-by: Abhishek Pandit-Subedi <[email protected]>
---
Changes in v2: None
drivers/bluetooth/btbcm.c | 35 +++++++++++++++++++++++++++++++++++
drivers/bluetooth/btbcm.h | 10 ++++++++++
2 files changed, 45 insertions(+)
diff --git a/drivers/bluetooth/btbcm.c b/drivers/bluetooth/btbcm.c
index 2d2e6d862068..f052518f7b0c 100644
--- a/drivers/bluetooth/btbcm.c
+++ b/drivers/bluetooth/btbcm.c
@@ -105,6 +105,41 @@ int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
}
EXPORT_SYMBOL_GPL(btbcm_set_bdaddr);
+int btbcm_set_pcm_params(struct hci_dev *hdev,
+ const struct bcm_set_pcm_int_params *int_params,
+ const struct bcm_set_pcm_format_params *format_params)
+{
+ struct sk_buff *skb;
+ int err;
+
+ if (int_params) {
+ skb = __hci_cmd_sync(hdev, 0xfc1c, 5, int_params,
+ HCI_INIT_TIMEOUT);
+ if (IS_ERR(skb)) {
+ err = PTR_ERR(skb);
+ bt_dev_err(hdev, "BCM: Set PCM int params failed (%d)",
+ err);
+ return err;
+ }
+ kfree_skb(skb);
+ }
+
+ if (format_params) {
+ skb = __hci_cmd_sync(hdev, 0xfc1e, 5, format_params,
+ HCI_INIT_TIMEOUT);
+ if (IS_ERR(skb)) {
+ err = PTR_ERR(skb);
+ bt_dev_err(hdev, "BCM: Set PCM data params failed (%d)",
+ err);
+ return err;
+ }
+ kfree_skb(skb);
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(btbcm_set_pcm_params);
+
int btbcm_patchram(struct hci_dev *hdev, const struct firmware *fw)
{
const struct hci_command_hdr *cmd;
diff --git a/drivers/bluetooth/btbcm.h b/drivers/bluetooth/btbcm.h
index d204be8a84bf..f0a63c65544e 100644
--- a/drivers/bluetooth/btbcm.h
+++ b/drivers/bluetooth/btbcm.h
@@ -54,6 +54,9 @@ struct bcm_set_pcm_format_params {
int btbcm_check_bdaddr(struct hci_dev *hdev);
int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr);
int btbcm_patchram(struct hci_dev *hdev, const struct firmware *fw);
+int btbcm_set_pcm_params(struct hci_dev *hdev,
+ const struct bcm_set_pcm_int_params *int_params,
+ const struct bcm_set_pcm_format_params *format_params);
int btbcm_setup_patchram(struct hci_dev *hdev);
int btbcm_setup_apple(struct hci_dev *hdev);
@@ -74,6 +77,13 @@ static inline int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
return -EOPNOTSUPP;
}
+int btbcm_set_pcm_params(struct hci_dev *hdev,
+ const struct bcm_set_pcm_int_params *int_params,
+ const struct bcm_set_pcm_format_params *format_params)
+{
+ return -EOPNOTSUPP;
+}
+
static inline int btbcm_patchram(struct hci_dev *hdev, const struct firmware *fw)
{
return -EOPNOTSUPP;
--
2.24.0.rc1.363.gb1bccd3e3d-goog
Hi Abhishek,
> Add BCM vendor specific commands to configure PCM.
please be a bit more descriptive and you can also add the command decoding from btmon here if you like.
>
> Signed-off-by: Abhishek Pandit-Subedi <[email protected]>
> ---
>
> Changes in v2: None
>
> drivers/bluetooth/btbcm.c | 35 +++++++++++++++++++++++++++++++++++
> drivers/bluetooth/btbcm.h | 10 ++++++++++
> 2 files changed, 45 insertions(+)
>
> diff --git a/drivers/bluetooth/btbcm.c b/drivers/bluetooth/btbcm.c
> index 2d2e6d862068..f052518f7b0c 100644
> --- a/drivers/bluetooth/btbcm.c
> +++ b/drivers/bluetooth/btbcm.c
> @@ -105,6 +105,41 @@ int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
> }
> EXPORT_SYMBOL_GPL(btbcm_set_bdaddr);
>
> +int btbcm_set_pcm_params(struct hci_dev *hdev,
> + const struct bcm_set_pcm_int_params *int_params,
> + const struct bcm_set_pcm_format_params *format_params)
> +{
> + struct sk_buff *skb;
> + int err;
> +
> + if (int_params) {
> + skb = __hci_cmd_sync(hdev, 0xfc1c, 5, int_params,
> + HCI_INIT_TIMEOUT);
> + if (IS_ERR(skb)) {
> + err = PTR_ERR(skb);
> + bt_dev_err(hdev, "BCM: Set PCM int params failed (%d)",
> + err);
> + return err;
> + }
> + kfree_skb(skb);
> + }
Actually lets do btbcm_set_pcm_int_params and focus on the ones you are using right now.
Regards
Marcel