Commit 46459cb6 authored by Hakan Jansson's avatar Hakan Jansson Committed by Luiz Augusto von Dentz

Bluetooth: hci_bcm: Increase host baudrate for CYW55572 in autobaud mode

Add device specific data for max baudrate in autobaud mode. This allows the
host to use a baudrate higher than "init speed" when loading FW in autobaud
mode.

The device specific max baudrate in autobaud mode for CYW55572 is set to
921600 bps. Devices without device specific max baudrate in autobaud mode
will use init speed as before. If no device specific init speed has been
specified, it will default to the bcm_proto default 115200 bps.

The increased baud rate improves FW load time. The exact load time will
depend on the specific system and FW being used. As a rough indication,
the FW load time dropped from ~9s @ 115.2kbps to ~1.7s @ 921.6kbps in one
test.
Signed-off-by: default avatarHakan Jansson <hakan.jansson@infineon.com>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
parent 9baee415
...@@ -53,10 +53,12 @@ ...@@ -53,10 +53,12 @@
* struct bcm_device_data - device specific data * struct bcm_device_data - device specific data
* @no_early_set_baudrate: Disallow set baudrate before driver setup() * @no_early_set_baudrate: Disallow set baudrate before driver setup()
* @drive_rts_on_open: drive RTS signal on ->open() when platform requires it * @drive_rts_on_open: drive RTS signal on ->open() when platform requires it
* @max_autobaud_speed: max baudrate supported by device in autobaud mode
*/ */
struct bcm_device_data { struct bcm_device_data {
bool no_early_set_baudrate; bool no_early_set_baudrate;
bool drive_rts_on_open; bool drive_rts_on_open;
u32 max_autobaud_speed;
}; };
/** /**
...@@ -100,6 +102,7 @@ struct bcm_device_data { ...@@ -100,6 +102,7 @@ struct bcm_device_data {
* @drive_rts_on_open: drive RTS signal on ->open() when platform requires it * @drive_rts_on_open: drive RTS signal on ->open() when platform requires it
* @pcm_int_params: keep the initial PCM configuration * @pcm_int_params: keep the initial PCM configuration
* @use_autobaud_mode: start Bluetooth device in autobaud mode * @use_autobaud_mode: start Bluetooth device in autobaud mode
* @max_autobaud_speed: max baudrate supported by device in autobaud mode
*/ */
struct bcm_device { struct bcm_device {
/* Must be the first member, hci_serdev.c expects this. */ /* Must be the first member, hci_serdev.c expects this. */
...@@ -139,6 +142,7 @@ struct bcm_device { ...@@ -139,6 +142,7 @@ struct bcm_device {
bool drive_rts_on_open; bool drive_rts_on_open;
bool use_autobaud_mode; bool use_autobaud_mode;
u8 pcm_int_params[5]; u8 pcm_int_params[5];
u32 max_autobaud_speed;
}; };
/* generic bcm uart resources */ /* generic bcm uart resources */
...@@ -479,7 +483,10 @@ static int bcm_open(struct hci_uart *hu) ...@@ -479,7 +483,10 @@ static int bcm_open(struct hci_uart *hu)
else if (bcm->dev->drive_rts_on_open) else if (bcm->dev->drive_rts_on_open)
hci_uart_set_flow_control(hu, true); hci_uart_set_flow_control(hu, true);
hu->init_speed = bcm->dev->init_speed; if (bcm->dev->use_autobaud_mode && bcm->dev->max_autobaud_speed)
hu->init_speed = min(bcm->dev->oper_speed, bcm->dev->max_autobaud_speed);
else
hu->init_speed = bcm->dev->init_speed;
/* If oper_speed is set, ldisc/serdev will set the baudrate /* If oper_speed is set, ldisc/serdev will set the baudrate
* before calling setup() * before calling setup()
...@@ -585,8 +592,8 @@ static int bcm_setup(struct hci_uart *hu) ...@@ -585,8 +592,8 @@ static int bcm_setup(struct hci_uart *hu)
return 0; return 0;
/* Init speed if any */ /* Init speed if any */
if (hu->init_speed) if (bcm->dev && bcm->dev->init_speed)
speed = hu->init_speed; speed = bcm->dev->init_speed;
else if (hu->proto->init_speed) else if (hu->proto->init_speed)
speed = hu->proto->init_speed; speed = hu->proto->init_speed;
else else
...@@ -1519,6 +1526,7 @@ static int bcm_serdev_probe(struct serdev_device *serdev) ...@@ -1519,6 +1526,7 @@ static int bcm_serdev_probe(struct serdev_device *serdev)
data = device_get_match_data(bcmdev->dev); data = device_get_match_data(bcmdev->dev);
if (data) { if (data) {
bcmdev->max_autobaud_speed = data->max_autobaud_speed;
bcmdev->no_early_set_baudrate = data->no_early_set_baudrate; bcmdev->no_early_set_baudrate = data->no_early_set_baudrate;
bcmdev->drive_rts_on_open = data->drive_rts_on_open; bcmdev->drive_rts_on_open = data->drive_rts_on_open;
} }
...@@ -1542,6 +1550,10 @@ static struct bcm_device_data bcm43438_device_data = { ...@@ -1542,6 +1550,10 @@ static struct bcm_device_data bcm43438_device_data = {
.drive_rts_on_open = true, .drive_rts_on_open = true,
}; };
static struct bcm_device_data cyw55572_device_data = {
.max_autobaud_speed = 921600,
};
static const struct of_device_id bcm_bluetooth_of_match[] = { static const struct of_device_id bcm_bluetooth_of_match[] = {
{ .compatible = "brcm,bcm20702a1" }, { .compatible = "brcm,bcm20702a1" },
{ .compatible = "brcm,bcm4329-bt" }, { .compatible = "brcm,bcm4329-bt" },
...@@ -1554,7 +1566,7 @@ static const struct of_device_id bcm_bluetooth_of_match[] = { ...@@ -1554,7 +1566,7 @@ static const struct of_device_id bcm_bluetooth_of_match[] = {
{ .compatible = "brcm,bcm4349-bt", .data = &bcm43438_device_data }, { .compatible = "brcm,bcm4349-bt", .data = &bcm43438_device_data },
{ .compatible = "brcm,bcm43540-bt", .data = &bcm4354_device_data }, { .compatible = "brcm,bcm43540-bt", .data = &bcm4354_device_data },
{ .compatible = "brcm,bcm4335a0" }, { .compatible = "brcm,bcm4335a0" },
{ .compatible = "infineon,cyw55572-bt" }, { .compatible = "infineon,cyw55572-bt", .data = &cyw55572_device_data },
{ }, { },
}; };
MODULE_DEVICE_TABLE(of, bcm_bluetooth_of_match); MODULE_DEVICE_TABLE(of, bcm_bluetooth_of_match);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment