lkml.org 
[lkml]   [2019]   [Nov]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 3/4] Bluetooth: hci_bcm: Support pcm params in dts
    Date
    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 <abhishekpandit@chromium.org>
    ---

    Changes in v2: None

    drivers/bluetooth/hci_bcm.c | 33 +++++++++++++++++++++++++++++++++
    1 file changed, 33 insertions(+)

    diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c
    index 2114df607cb3..46e4793fc234 100644
    --- a/drivers/bluetooth/hci_bcm.c
    +++ b/drivers/bluetooth/hci_bcm.c
    @@ -79,6 +79,8 @@
    * @hu: pointer to HCI UART controller struct,
    * used to disable flow control during runtime suspend and system sleep
    * @is_suspended: whether flow control is currently disabled
    + * @has_pcm_params: whether PCM parameters need to be configured
    + * @pcm_params: PCM and routing parameters
    */
    struct bcm_device {
    /* Must be the first member, hci_serdev.c expects this. */
    @@ -112,6 +114,9 @@ struct bcm_device {
    struct hci_uart *hu;
    bool is_suspended;
    #endif
    +
    + bool has_pcm_params;
    + struct bcm_set_pcm_int_params pcm_params;
    };

    /* generic bcm uart resources */
    @@ -576,6 +581,17 @@ static int bcm_setup(struct hci_uart *hu)
    host_set_baudrate(hu, speed);
    }

    + /* PCM parameters if any*/
    + if (bcm->dev && bcm->dev->has_pcm_params) {
    + err = btbcm_set_pcm_params(hu->hdev, &bcm->dev->pcm_params,
    + NULL);
    +
    + if (err) {
    + bt_dev_info(hu->hdev, "BCM: Set pcm params failed (%d)",
    + err);
    + }
    + }
    +
    finalize:
    release_firmware(fw);

    @@ -1112,7 +1128,24 @@ static int bcm_acpi_probe(struct bcm_device *dev)

    static int bcm_of_probe(struct bcm_device *bdev)
    {
    + int err;
    +
    device_property_read_u32(bdev->dev, "max-speed", &bdev->oper_speed);
    +
    + err = device_property_read_u8(bdev->dev, "brcm,sco-routing",
    + &bdev->pcm_params.routing);
    + if (!err)
    + bdev->has_pcm_params = true;
    +
    + device_property_read_u8(bdev->dev, "brcm,pcm-interface-rate",
    + &bdev->pcm_params.rate);
    + device_property_read_u8(bdev->dev, "brcm,pcm-frame-type",
    + &bdev->pcm_params.frame_sync);
    + device_property_read_u8(bdev->dev, "brcm,pcm-sync-mode",
    + &bdev->pcm_params.sync_mode);
    + device_property_read_u8(bdev->dev, "brcm,pcm-clock-mode",
    + &bdev->pcm_params.clock_mode);
    +
    return 0;
    }

    --
    2.24.0.rc1.363.gb1bccd3e3d-goog
    \
     
     \ /
      Last update: 2019-11-08 00:29    [W:2.873 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site