lkml.org 
[lkml]   [2021]   [Jan]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 31/57] usb: dwc3: ulpi: Use VStsDone to detect PHY regs access completion
    Date
    From: Serge Semin <Sergey.Semin@baikalelectronics.ru>

    commit ce722da66d3e9384aa2de9d33d584ee154e5e157 upstream.

    In accordance with [1] the DWC_usb3 core sets the GUSB2PHYACCn.VStsDone
    bit when the PHY vendor control access is done and clears it when the
    application initiates a new transaction. The doc doesn't say anything
    about the GUSB2PHYACCn.VStsBsy flag serving for the same purpose. Moreover
    we've discovered that the VStsBsy flag can be cleared before the VStsDone
    bit. So using the former as a signal of the PHY control registers
    completion might be dangerous. Let's have the VStsDone flag utilized
    instead then.

    [1] Synopsys DesignWare Cores SuperSpeed USB 3.0 xHCI Host Controller
    Databook, 2.70a, December 2013, p.388

    Fixes: 88bc9d194ff6 ("usb: dwc3: add ULPI interface support")
    Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru>
    Link: https://lore.kernel.org/r/20201210085008.13264-2-Sergey.Semin@baikalelectronics.ru
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/usb/dwc3/core.h | 1 +
    drivers/usb/dwc3/ulpi.c | 2 +-
    2 files changed, 2 insertions(+), 1 deletion(-)

    --- a/drivers/usb/dwc3/core.h
    +++ b/drivers/usb/dwc3/core.h
    @@ -227,6 +227,7 @@

    /* Global USB2 PHY Vendor Control Register */
    #define DWC3_GUSB2PHYACC_NEWREGREQ BIT(25)
    +#define DWC3_GUSB2PHYACC_DONE BIT(24)
    #define DWC3_GUSB2PHYACC_BUSY BIT(23)
    #define DWC3_GUSB2PHYACC_WRITE BIT(22)
    #define DWC3_GUSB2PHYACC_ADDR(n) (n << 16)
    --- a/drivers/usb/dwc3/ulpi.c
    +++ b/drivers/usb/dwc3/ulpi.c
    @@ -27,7 +27,7 @@ static int dwc3_ulpi_busyloop(struct dwc

    while (count--) {
    reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYACC(0));
    - if (!(reg & DWC3_GUSB2PHYACC_BUSY))
    + if (reg & DWC3_GUSB2PHYACC_DONE)
    return 0;
    cpu_relax();
    }

    \
     
     \ /
      Last update: 2021-01-11 15:11    [W:4.114 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site