Commit Graph

9 Commits

Author SHA1 Message Date
Torez Smith 2cf627599f usb: dwc2: drd: fix soft connect when gadget is unconfigured
Bugzilla: http://bugzilla.redhat.com/2061784
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=45014530
Tested: HP ZBook 15 G5/80D5 Laptop
 TGL-U(QS) Laptop

commit 32fde84362c40961726a5c91f35ad37355ccc0c6
Author: Fabrice Gasnier <fabrice.gasnier@foss.st.com>
Date:   Wed Feb 16 09:12:15 2022 +0100

    usb: dwc2: drd: fix soft connect when gadget is unconfigured

    When the gadget driver hasn't been (yet) configured, and the cable is
    connected to a HOST, the SFTDISCON gets cleared unconditionally, so the
    HOST tries to enumerate it.
    At the host side, this can result in a stuck USB port or worse. When
    getting lucky, some dmesg can be observed at the host side:
     new high-speed USB device number ...
     device descriptor read/64, error -110

    Fix it in drd, by checking the enabled flag before calling
    dwc2_hsotg_core_connect(). It will be called later, once configured,
    by the normal flow:
    - udc_bind_to_driver
     - usb_gadget_connect
       - dwc2_hsotg_pullup
         - dwc2_hsotg_core_connect

    Fixes: 17f934024e ("usb: dwc2: override PHY input signals with usb role switch support")
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Fabrice Gasnier <fabrice.gasnier@foss.st.com>
    Link: https://lore.kernel.org/r/1644999135-13478-1-git-send-email-fabrice.gasnier@foss.st.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Signed-off-by: Torez Smith <torez@redhat.com>
2022-05-02 15:30:45 -04:00
Torez Smith 63c43ca929 Revert "usb: dwc2: drd: fix soft connect when gadget is unconfigured"
Bugzilla: http://bugzilla.redhat.com/2061784
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=45014530
Tested: HP ZBook 15 G5/80D5 Laptop
 TGL-U(QS) Laptop

commit 736e8d89044c1c330967fb938fa766cd9e0d8af0
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Sat Feb 12 10:08:54 2022 +0100

    Revert "usb: dwc2: drd: fix soft connect when gadget is unconfigured"

    This reverts commit 269cbcf7b72de6f0016806d4a0cec1d689b55a87.

    It causes build errors as reported by the kernel test robot.

    Link: https://lore.kernel.org/r/202202112236.AwoOTtHO-lkp@intel.com
    Reported-by: kernel test robot <lkp@intel.com>
    Fixes: 269cbcf7b72d ("usb: dwc2: drd: fix soft connect when gadget is unconfigured")
    Cc: stable@kernel.org
    Cc: Amelie Delaunay <amelie.delaunay@foss.st.com>
    Cc: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Cc: Fabrice Gasnier <fabrice.gasnier@foss.st.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Signed-off-by: Torez Smith <torez@redhat.com>
2022-05-02 15:30:44 -04:00
Torez Smith e3a42c0eca usb: dwc2: drd: fix soft connect when gadget is unconfigured
Bugzilla: http://bugzilla.redhat.com/2061784
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=45014530
Tested: HP ZBook 15 G5/80D5 Laptop
 TGL-U(QS) Laptop

commit 269cbcf7b72de6f0016806d4a0cec1d689b55a87
Author: Fabrice Gasnier <fabrice.gasnier@foss.st.com>
Date:   Wed Feb 9 17:15:53 2022 +0100

    usb: dwc2: drd: fix soft connect when gadget is unconfigured

    When the gadget driver hasn't been (yet) configured, and the cable is
    connected to a HOST, the SFTDISCON gets cleared unconditionally, so the
    HOST tries to enumerate it.
    At the host side, this can result in a stuck USB port or worse. When
    getting lucky, some dmesg can be observed at the host side:
     new high-speed USB device number ...
     device descriptor read/64, error -110

    Fix it in drd, by checking the enabled flag before calling
    dwc2_hsotg_core_connect(). It will be called later, once configured,
    by the normal flow:
    - udc_bind_to_driver
     - usb_gadget_connect
       - dwc2_hsotg_pullup
         - dwc2_hsotg_core_connect

    Fixes: 17f934024e ("usb: dwc2: override PHY input signals with usb role switch support")
    Cc: stable@kernel.org
    Reviewed-by: Amelie Delaunay <amelie.delaunay@foss.st.com>
    Acked-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Signed-off-by: Fabrice Gasnier <fabrice.gasnier@foss.st.com>
    Link: https://lore.kernel.org/r/1644423353-17859-1-git-send-email-fabrice.gasnier@foss.st.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Signed-off-by: Torez Smith <torez@redhat.com>
2022-05-02 15:30:43 -04:00
Torez Smith 52daabed0d usb: dwc2: drd: restore role and overrides upon resume
Bugzilla: http://bugzilla.redhat.com/2061784
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=45014530
Tested: HP ZBook 15 G5/80D5 Laptop
 TGL-U(QS) Laptop

commit 3ad02e0e524117d019417b88715c69802ec9c5e0
Author: Fabrice Gasnier <fabrice.gasnier@foss.st.com>
Date:   Mon Dec 6 16:56:43 2021 +0100

    usb: dwc2: drd: restore role and overrides upon resume

    Override enable bits may not be restored when going to low power mode
    (e.g. when in DWC2_POWER_DOWN_PARAM_NONE).
    These bits are set when probing/initializing drd (role switch). Restore
    them upon resume from low power mode (in case these have been lost).

    To achieve this, the last known role is restored upon resume. And the
    override enable bits are always set when configuring aval, bval and vbval.

    When resuming, forcing the role should be done only once, or this can cause
    port changes in HOST mode for instance.
    So, only restore FORCEDEVMODE/FORCEHOSTMODE when role_sw is unused

    Acked-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Signed-off-by: Fabrice Gasnier <fabrice.gasnier@foss.st.com>
    Link: https://lore.kernel.org/r/1638806203-6624-4-git-send-email-fabrice.gasnier@foss.st.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Signed-off-by: Torez Smith <torez@redhat.com>
2022-05-02 15:30:26 -04:00
Torez Smith 3f73635b40 usb: dwc2: drd: add role-switch-default-node support
Bugzilla: http://bugzilla.redhat.com/2061784
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=45014530
Tested: HP ZBook 15 G5/80D5 Laptop
 TGL-U(QS) Laptop

commit e14acb8769850fedfbfc62a64998e34348442784
Author: Fabrice Gasnier <fabrice.gasnier@foss.st.com>
Date:   Mon Dec 6 16:56:42 2021 +0100

    usb: dwc2: drd: add role-switch-default-node support

    When using usb-role-switch, while the usb role is not yet define
    (USB_ROLE_NONE), the user may want to configure the default mode to host
    or device.
    Use role-switch-default-mode for that purpose.

    Acked-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Signed-off-by: Amelie Delaunay <amelie.delaunay@foss.st.com>
    Signed-off-by: Fabrice Gasnier <fabrice.gasnier@foss.st.com>
    Link: https://lore.kernel.org/r/1638806203-6624-3-git-send-email-fabrice.gasnier@foss.st.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Signed-off-by: Torez Smith <torez@redhat.com>
2022-05-02 15:30:26 -04:00
Torez Smith 723d4e9848 usb: dwc2: drd: reset current session before setting the new one
Bugzilla: http://bugzilla.redhat.com/2061784
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=45014530
Tested: HP ZBook 15 G5/80D5 Laptop
 TGL-U(QS) Laptop

commit 1ad707f559f7cb12c64f3d7cb37f0b1ea27c1058
Author: Amelie Delaunay <amelie.delaunay@foss.st.com>
Date:   Tue Oct 5 11:53:05 2021 +0200

    usb: dwc2: drd: reset current session before setting the new one

    If role is changed without the "none" step, A- and B- valid session could
    be set at the same time. It is an issue.
    This patch resets A-session if role switch sets B-session, and resets
    B-session if role switch sets A-session.
    Then, it is possible to change the role without the "none" step.

    Fixes: 17f934024e ("usb: dwc2: override PHY input signals with usb role switch support")
    Acked-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Signed-off-by: Amelie Delaunay <amelie.delaunay@foss.st.com>
    Link: https://lore.kernel.org/r/20211005095305.66397-4-amelie.delaunay@foss.st.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Signed-off-by: Torez Smith <torez@redhat.com>
2022-05-02 15:29:54 -04:00
Torez Smith 8f600163d2 usb: dwc2: drd: fix dwc2_drd_role_sw_set when clock could be disabled
Bugzilla: http://bugzilla.redhat.com/2061784
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=45014530
Tested: HP ZBook 15 G5/80D5 Laptop
 TGL-U(QS) Laptop

commit 8d387f61b0240854e81450c261beb775065bad5d
Author: Amelie Delaunay <amelie.delaunay@foss.st.com>
Date:   Tue Oct 5 11:53:04 2021 +0200

    usb: dwc2: drd: fix dwc2_drd_role_sw_set when clock could be disabled

    In case of USB_DR_MODE_PERIPHERAL, the OTG clock is disabled at the end of
    the probe (it is not the case if USB_DR_MODE_HOST or USB_DR_MODE_OTG).
    The clock is then enabled on udc_start.
    If dwc2_drd_role_sw_set is called before udc_start (it is the case if the
    usb cable is plugged at boot), GOTGCTL and GUSBCFG registers cannot be
    read/written, so session cannot be overridden.
    To avoid this case, check the ll_hw_enabled value and enable the clock if
    it is available, and disable it after the override.

    Fixes: 17f934024e ("usb: dwc2: override PHY input signals with usb role switch support")
    Acked-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Signed-off-by: Amelie Delaunay <amelie.delaunay@foss.st.com>
    Link: https://lore.kernel.org/r/20211005095305.66397-3-amelie.delaunay@foss.st.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Signed-off-by: Torez Smith <torez@redhat.com>
2022-05-02 15:29:54 -04:00
Torez Smith 8be60bf47a usb: dwc2: drd: fix dwc2_force_mode call in dwc2_ovr_init
Bugzilla: http://bugzilla.redhat.com/2061784
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=45014530
Tested: HP ZBook 15 G5/80D5 Laptop
 TGL-U(QS) Laptop

commit b2cab2a24fb5d13ce1d384ecfb6de827fa08a048
Author: Amelie Delaunay <amelie.delaunay@foss.st.com>
Date:   Tue Oct 5 11:53:03 2021 +0200

    usb: dwc2: drd: fix dwc2_force_mode call in dwc2_ovr_init

    Instead of forcing the role to Device, check the dr_mode configuration.
    If the core is Host only, force the mode to Host, this to avoid the
    dwc2_force_mode warning:
    WARNING: CPU: 1 PID: 21 at drivers/usb/dwc2/core.c:615 dwc2_drd_init+0x104/0x17c

    When forcing mode to Host, dwc2_force_mode may sleep the time the host
    role is applied. To avoid sleeping while atomic context, move the call
    to dwc2_force_mode after spin_unlock_irqrestore. It is safe, as
    interrupts are not yet unmasked here.

    Fixes: 17f934024e ("usb: dwc2: override PHY input signals with usb role switch support")
    Acked-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Signed-off-by: Amelie Delaunay <amelie.delaunay@foss.st.com>
    Link: https://lore.kernel.org/r/20211005095305.66397-2-amelie.delaunay@foss.st.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Signed-off-by: Torez Smith <torez@redhat.com>
2022-05-02 15:29:54 -04:00
Amelie Delaunay 17f934024e usb: dwc2: override PHY input signals with usb role switch support
This patch adds support for usb role switch to dwc2, by using overriding
control of the PHY voltage valid and ID input signals.

iddig signal (ID) can be overridden:
- when setting GUSBCFG_FORCEHOSTMODE, iddig input pin is overridden with 1;
- when setting GUSBCFG_FORCEDEVMODE, iddig input pin is overridden with 0.

avalid/bvalid/vbusvalid signals can be overridden respectively with:
- GOTGCTL_AVALOEN + GOTGCTL_AVALOVAL
- GOTGCTL_BVALOEN + GOTGCTL_BVALOVAL
- GOTGCTL_VBVALEN + GOTGCTL_VBVALOVAL

It is possible to determine valid sessions thanks to usb role switch:
- if USB_ROLE_NONE then !avalid && !bvalid && !vbusvalid
- if USB_ROLE_DEVICE then !avalid && bvalid && vbusvalid
- if USB_ROLE_HOST then avalid && !bvalid && vbusvalid

Acked-by: Minas Harutyunyan <hminas@synopsys.com>
Acked-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Signed-off-by: Amelie Delaunay <amelie.delaunay@st.com>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
2020-10-02 13:29:13 +03:00