* struct bcm_device_data - device specific data
  * @no_early_set_baudrate: Disallow set baudrate before driver setup()
  * @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 {
        bool    no_early_set_baudrate;
        bool    drive_rts_on_open;
+       u32     max_autobaud_speed;
 };
 
 /**
  * @drive_rts_on_open: drive RTS signal on ->open() when platform requires it
  * @pcm_int_params: keep the initial PCM configuration
  * @use_autobaud_mode: start Bluetooth device in autobaud mode
+ * @max_autobaud_speed: max baudrate supported by device in autobaud mode
  */
 struct bcm_device {
        /* Must be the first member, hci_serdev.c expects this. */
        bool                    drive_rts_on_open;
        bool                    use_autobaud_mode;
        u8                      pcm_int_params[5];
+       u32                     max_autobaud_speed;
 };
 
 /* generic bcm uart resources */
                else if (bcm->dev->drive_rts_on_open)
                        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
                 * before calling setup()
                return 0;
 
        /* Init speed if any */
-       if (hu->init_speed)
-               speed = hu->init_speed;
+       if (bcm->dev && bcm->dev->init_speed)
+               speed = bcm->dev->init_speed;
        else if (hu->proto->init_speed)
                speed = hu->proto->init_speed;
        else
 
        data = device_get_match_data(bcmdev->dev);
        if (data) {
+               bcmdev->max_autobaud_speed = data->max_autobaud_speed;
                bcmdev->no_early_set_baudrate = data->no_early_set_baudrate;
                bcmdev->drive_rts_on_open = data->drive_rts_on_open;
        }
        .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[] = {
        { .compatible = "brcm,bcm20702a1" },
        { .compatible = "brcm,bcm4329-bt" },
        { .compatible = "brcm,bcm4349-bt", .data = &bcm43438_device_data },
        { .compatible = "brcm,bcm43540-bt", .data = &bcm4354_device_data },
        { .compatible = "brcm,bcm4335a0" },
-       { .compatible = "infineon,cyw55572-bt" },
+       { .compatible = "infineon,cyw55572-bt", .data = &cyw55572_device_data },
        { },
 };
 MODULE_DEVICE_TABLE(of, bcm_bluetooth_of_match);