Bluetooth: btbcm: Support pcm configuration
Marcel Holtmann
maintainerPATCH v2 2/4 Bluetooth: btbcm: Support pcm configuration
From: Abhishek Pandit-Subedi <[email protected]>
Add BCM vendor specific command to configure PCM parameters. The new vendor opcode allows us to set the sco routing, the pcm interface rate, and a few other pcm specific options (frame sync, sync mode, and clock mode). See broadcom-bluetooth.txt in Documentation for more information about valid values for those settings.
Here is an example trace where this opcode was used to configure a BCM4354:
< HCI Command: Vendor (0x3f|0x001c) plen 5
01 02 00 01 01
> HCI Event: Command Complete (0x0e) plen 4
Vendor (0x3f|0x001c) ncmd 1
Status: Success (0x00)We can read back the values as well with ocf 0x001d to confirm the values that were set:
$ hcitool cmd 0x3f 0x001d
< HCI Command: ogf 0x3f, ocf 0x001d, plen 0
> HCI Event: 0x0e plen 9
01 1D FC 00 01 02 00 01 01Signed-off-by Abhishek Pandit-Subedi <[email protected]>
Signed-off-by Marcel Holtmann <[email protected]>
--- drivers/bluetooth/btbcm.c | 46 +++++++++++++++++++++++++++++++++++++++ drivers/bluetooth/btbcm.h | 16 ++++++++++++++ 2 files changed, 62 insertions(+)
drivers/bluetooth/btbcm.c +46 -0
@@ -107,6 +107,52 @@ int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr) }EXPORT_SYMBOL_GPL (btbcm_set_bdaddr); +int btbcm_read_pcm_int_params (struct hci_dev *hdev, +struct bcm_set_pcm_int_params *params) +{ +struct sk_buff *skb; +int err =0 ; + + skb =__hci_cmd_sync (hdev,0xfc1d ,0 ,NULL ,HCI_INIT_TIMEOUT ); +if (IS_ERR (skb)) { + err =PTR_ERR (skb); +bt_dev_err (hdev,"BCM: Read PCM int params failed (%d)" , err); +return err; + } + +if (skb->len !=6 || skb->data[0 ]) { +bt_dev_err (hdev,"BCM: Read PCM int params length mismatch" ); +kfree_skb (skb); +return -EIO ; + } + +if (params) +memcpy (params, skb->data +1 ,5 ); + +kfree_skb (skb); + +return 0 ; +} +EXPORT_SYMBOL_GPL (btbcm_read_pcm_int_params); + +int btbcm_write_pcm_int_params (struct hci_dev *hdev, +const struct bcm_set_pcm_int_params *params) +{ +struct sk_buff *skb; +int err; + + skb =__hci_cmd_sync (hdev,0xfc1c ,5 , params,HCI_INIT_TIMEOUT ); +if (IS_ERR (skb)) { + err =PTR_ERR (skb); +bt_dev_err (hdev,"BCM: Write PCM int params failed (%d)" , err); +return err; + } +kfree_skb (skb); + +return 0 ; +} +EXPORT_SYMBOL_GPL (btbcm_write_pcm_int_params); +int btbcm_patchram (struct hci_dev *hdev,const struct firmware *fw) {const struct hci_command_hdr *cmd;
drivers/bluetooth/btbcm.h +16 -0
@@ -54,6 +54,10 @@ 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_read_pcm_int_params (struct hci_dev *hdev, +struct bcm_set_pcm_int_params *params); +int btbcm_write_pcm_int_params (struct hci_dev *hdev, +const struct bcm_set_pcm_int_params *params);int btbcm_setup_patchram (struct hci_dev *hdev);int btbcm_setup_apple (struct hci_dev *hdev);
@@ -74,6 +78,18 @@ static inline int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)return -EOPNOTSUPP ; } +int btbcm_read_pcm_int_params (struct hci_dev *hdev, +struct bcm_set_pcm_int_params *params) +{ +return -EOPNOTSUPP ; +} + +int btbcm_write_pcm_int_params (struct hci_dev *hdev, +const struct bcm_set_pcm_int_params *params) +{ +return -EOPNOTSUPP ; +} +static inline int btbcm_patchram (struct hci_dev *hdev,const struct firmware *fw) {return -EOPNOTSUPP ;
Signature · 1 line
2.23.0