From: Abhishek Pandit-Subedi <[email protected]>
BCM chips may require configuration of PCM to operate correctly and
there is a vendor specific HCI command to do this. Add support in the
hci_bcm driver to parse this from devicetree and configure the chip.
Signed-off-by: Abhishek Pandit-Subedi <[email protected]>
Signed-off-by: Marcel Holtmann <[email protected]>
---
drivers/bluetooth/hci_bcm.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c
index d48044276895..9cfb202bbeca 100644
--- a/drivers/bluetooth/hci_bcm.c
+++ b/drivers/bluetooth/hci_bcm.c
@@ -122,6 +122,7 @@ struct bcm_device {
bool is_suspended;
#endif
bool no_early_set_baudrate;
+ u8 pcm_int_params[5];
};
/* generic bcm uart resources */
@@ -594,6 +595,16 @@ static int bcm_setup(struct hci_uart *hu)
host_set_baudrate(hu, speed);
}
+ /* PCM parameters if provided */
+ if (bcm->dev && bcm->dev->pcm_int_params[0] != 0xff) {
+ struct bcm_set_pcm_int_params params;
+
+ btbcm_read_pcm_int_params(hu->hdev, ¶ms);
+
+ memcpy(¶ms, bcm->dev->pcm_int_params, 5);
+ btbcm_write_pcm_int_params(hu->hdev, ¶ms);
+ }
+
finalize:
release_firmware(fw);
@@ -1131,6 +1142,8 @@ static int bcm_acpi_probe(struct bcm_device *dev)
static int bcm_of_probe(struct bcm_device *bdev)
{
device_property_read_u32(bdev->dev, "max-speed", &bdev->oper_speed);
+ device_property_read_u8_array(bdev->dev, "brcm,bt-pcm-int-params",
+ bdev->pcm_int_params, 5);
return 0;
}
@@ -1146,6 +1159,9 @@ static int bcm_probe(struct platform_device *pdev)
dev->dev = &pdev->dev;
dev->irq = platform_get_irq(pdev, 0);
+ /* Initialize routing field to an unsued value */
+ dev->pcm_int_params[0] = 0xff;
+
if (has_acpi_companion(&pdev->dev)) {
ret = bcm_acpi_probe(dev);
if (ret)
@@ -1406,6 +1422,9 @@ static int bcm_serdev_probe(struct serdev_device *serdev)
bcmdev->serdev_hu.serdev = serdev;
serdev_device_set_drvdata(serdev, bcmdev);
+ /* Initialize routing field to an unsued value */
+ bcmdev->pcm_int_params[0] = 0xff;
+
if (has_acpi_companion(&serdev->dev))
err = bcm_acpi_probe(bcmdev);
else
--
2.23.0
On Sat, Nov 23, 2019 at 2:01 AM Marcel Holtmann <[email protected]> wrote:
>
> From: Abhishek Pandit-Subedi <[email protected]>
>
> BCM chips may require configuration of PCM to operate correctly and
> there is a vendor specific HCI command to do this. Add support in the
> hci_bcm driver to parse this from devicetree and configure the chip.
>
> Signed-off-by: Abhishek Pandit-Subedi <[email protected]>
> Signed-off-by: Marcel Holtmann <[email protected]>
> ---
> drivers/bluetooth/hci_bcm.c | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
>
> diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c
> index d48044276895..9cfb202bbeca 100644
> --- a/drivers/bluetooth/hci_bcm.c
> +++ b/drivers/bluetooth/hci_bcm.c
> @@ -122,6 +122,7 @@ struct bcm_device {
> bool is_suspended;
> #endif
> bool no_early_set_baudrate;
> + u8 pcm_int_params[5];
> };
>
> /* generic bcm uart resources */
> @@ -594,6 +595,16 @@ static int bcm_setup(struct hci_uart *hu)
> host_set_baudrate(hu, speed);
> }
>
> + /* PCM parameters if provided */
> + if (bcm->dev && bcm->dev->pcm_int_params[0] != 0xff) {
> + struct bcm_set_pcm_int_params params;
> +
> + btbcm_read_pcm_int_params(hu->hdev, ¶ms);
This seems redundant since we just overwrite it anyway.
> +
> + memcpy(¶ms, bcm->dev->pcm_int_params, 5);
> + btbcm_write_pcm_int_params(hu->hdev, ¶ms);
> + }
> +
> finalize:
> release_firmware(fw);
>
> @@ -1131,6 +1142,8 @@ static int bcm_acpi_probe(struct bcm_device *dev)
> static int bcm_of_probe(struct bcm_device *bdev)
> {
> device_property_read_u32(bdev->dev, "max-speed", &bdev->oper_speed);
> + device_property_read_u8_array(bdev->dev, "brcm,bt-pcm-int-params",
> + bdev->pcm_int_params, 5);
> return 0;
> }
>
> @@ -1146,6 +1159,9 @@ static int bcm_probe(struct platform_device *pdev)
> dev->dev = &pdev->dev;
> dev->irq = platform_get_irq(pdev, 0);
>
> + /* Initialize routing field to an unsued value */
unused
> + dev->pcm_int_params[0] = 0xff;
> +
> if (has_acpi_companion(&pdev->dev)) {
> ret = bcm_acpi_probe(dev);
> if (ret)
> @@ -1406,6 +1422,9 @@ static int bcm_serdev_probe(struct serdev_device *serdev)
> bcmdev->serdev_hu.serdev = serdev;
> serdev_device_set_drvdata(serdev, bcmdev);
>
> + /* Initialize routing field to an unsued value */
unused
> + bcmdev->pcm_int_params[0] = 0xff;
> +
> if (has_acpi_companion(&serdev->dev))
> err = bcm_acpi_probe(bcmdev);
> else
> --
> 2.23.0
>
Hi Abhishek,
>> BCM chips may require configuration of PCM to operate correctly and
>> there is a vendor specific HCI command to do this. Add support in the
>> hci_bcm driver to parse this from devicetree and configure the chip.
>>
>> Signed-off-by: Abhishek Pandit-Subedi <[email protected]>
>> Signed-off-by: Marcel Holtmann <[email protected]>
>> ---
>> drivers/bluetooth/hci_bcm.c | 19 +++++++++++++++++++
>> 1 file changed, 19 insertions(+)
>>
>> diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c
>> index d48044276895..9cfb202bbeca 100644
>> --- a/drivers/bluetooth/hci_bcm.c
>> +++ b/drivers/bluetooth/hci_bcm.c
>> @@ -122,6 +122,7 @@ struct bcm_device {
>> bool is_suspended;
>> #endif
>> bool no_early_set_baudrate;
>> + u8 pcm_int_params[5];
>> };
>>
>> /* generic bcm uart resources */
>> @@ -594,6 +595,16 @@ static int bcm_setup(struct hci_uart *hu)
>> host_set_baudrate(hu, speed);
>> }
>>
>> + /* PCM parameters if provided */
>> + if (bcm->dev && bcm->dev->pcm_int_params[0] != 0xff) {
>> + struct bcm_set_pcm_int_params params;
>> +
>> + btbcm_read_pcm_int_params(hu->hdev, ¶ms);
> This seems redundant since we just overwrite it anyway.
this is here to have it show up in btmon.
>
>> +
>> + memcpy(¶ms, bcm->dev->pcm_int_params, 5);
>> + btbcm_write_pcm_int_params(hu->hdev, ¶ms);
>> + }
>> +
>> finalize:
>> release_firmware(fw);
>>
>> @@ -1131,6 +1142,8 @@ static int bcm_acpi_probe(struct bcm_device *dev)
>> static int bcm_of_probe(struct bcm_device *bdev)
>> {
>> device_property_read_u32(bdev->dev, "max-speed", &bdev->oper_speed);
>> + device_property_read_u8_array(bdev->dev, "brcm,bt-pcm-int-params",
>> + bdev->pcm_int_params, 5);
>> return 0;
>> }
>>
>> @@ -1146,6 +1159,9 @@ static int bcm_probe(struct platform_device *pdev)
>> dev->dev = &pdev->dev;
>> dev->irq = platform_get_irq(pdev, 0);
>>
>> + /* Initialize routing field to an unsued value */
> unused
>> + dev->pcm_int_params[0] = 0xff;
>> +
>> if (has_acpi_companion(&pdev->dev)) {
>> ret = bcm_acpi_probe(dev);
>> if (ret)
>> @@ -1406,6 +1422,9 @@ static int bcm_serdev_probe(struct serdev_device *serdev)
>> bcmdev->serdev_hu.serdev = serdev;
>> serdev_device_set_drvdata(serdev, bcmdev);
>>
>> + /* Initialize routing field to an unsued value */
> unused
Good catch. I will fix this up.
Regards
Marcel