]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
usb: musb: da8xx: Implement BABBLE recovery
authorBastien Curutchet <bastien.curutchet@bootlin.com>
Tue, 28 May 2024 10:20:26 +0000 (12:20 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 4 Jun 2024 13:44:11 +0000 (15:44 +0200)
There is no specific behaviour implemented to recover from a babble
error. When a BABBLE error happens, recovery fails as connected sticks
are no longer detected by the USB controller.

Implement the recover callback of the MUSB operation to reset the USB
controller when a BABBLE happens.

Signed-off-by: Bastien Curutchet <bastien.curutchet@bootlin.com>
Link: https://lore.kernel.org/r/20240528102026.40136-5-bastien.curutchet@bootlin.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/musb/da8xx.c

index c5cf733673a2e1353fe41974057fa71f8d091c3d..fcf06dcf2d6148481e5f143193e186bf674f8490 100644 (file)
@@ -220,6 +220,13 @@ static void __maybe_unused da8xx_musb_try_idle(struct musb *musb, unsigned long
        mod_timer(&musb->dev_timer, timeout);
 }
 
+static int da8xx_babble_recover(struct musb *musb)
+{
+       dev_dbg(musb->controller, "resetting controller to recover from babble\n");
+       musb_writel(musb->ctrl_base, DA8XX_USB_CTRL_REG, DA8XX_SOFT_RESET_MASK);
+       return 0;
+}
+
 static irqreturn_t da8xx_musb_interrupt(int irq, void *hci)
 {
        struct musb             *musb = hci;
@@ -480,6 +487,7 @@ static const struct musb_platform_ops da8xx_ops = {
 #ifndef CONFIG_USB_MUSB_HOST
        .try_idle       = da8xx_musb_try_idle,
 #endif
+       .recover        = da8xx_babble_recover,
 
        .set_vbus       = da8xx_musb_set_vbus,
 };