From 068f83499c2f8299c6172c511ec875eef2b26a6f Mon Sep 17 00:00:00 2001 From: Varadarajan Narayanan Date: Wed, 15 Jan 2025 11:50:44 +0530 Subject: usb: dwc3: core: Fix timeout check dwc3_core_init loops 'timeout' times to check if the IP block is out of reset using 'while (timeout--)'. If there is some issue and the block doesn't come out of reset, the loop will run till 'timeout' becomes zero and the post decrement operator would set timeout to 0xffffffff. Though the IP block is not out reset, the subsequent if check 'if !timeout' would fail as timeout is not equal to zero and the function proceeds with the initialization. Use poll API instead to resolve this. Signed-off-by: Varadarajan Narayanan Reviewed-by: Mattijs Korpershoek Reviewed-by: Caleb Connolly --- drivers/usb/dwc3/core.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index a35b8c2f646..847fa1f82c3 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -587,7 +588,6 @@ static void dwc3_set_incr_burst_type(struct dwc3 *dwc) */ static int dwc3_core_init(struct dwc3 *dwc) { - unsigned long timeout; u32 hwparams4 = dwc->hwparams.hwparams4; u32 reg; int ret; @@ -610,15 +610,11 @@ static int dwc3_core_init(struct dwc3 *dwc) } /* issue device SoftReset too */ - timeout = 5000; dwc3_writel(dwc->regs, DWC3_DCTL, DWC3_DCTL_CSFTRST); - while (timeout--) { - reg = dwc3_readl(dwc->regs, DWC3_DCTL); - if (!(reg & DWC3_DCTL_CSFTRST)) - break; - }; - - if (!timeout) { + ret = read_poll_timeout(dwc3_readl, reg, + !(reg & DWC3_DCTL_CSFTRST), + 1, 5000, dwc->regs, DWC3_DCTL); + if (ret) { dev_err(dwc->dev, "Reset Timed Out\n"); ret = -ETIMEDOUT; goto err0; -- cgit v1.3.1 From cd9c8814b0cd0200b68f96406b3ce9f2b1a6af87 Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Fri, 14 Mar 2025 19:27:35 -0600 Subject: usb: ulpi: Remove unused omap-ulpi-viewport driver The last platform to enable this driver was removed in 2019. Remove this unused code and documentation now. Signed-off-by: Tom Rini --- doc/README.omap-ulpi-viewport | 27 ------------- drivers/usb/ulpi/Kconfig | 5 --- drivers/usb/ulpi/Makefile | 1 - drivers/usb/ulpi/omap-ulpi-viewport.c | 71 ----------------------------------- 4 files changed, 104 deletions(-) delete mode 100644 doc/README.omap-ulpi-viewport delete mode 100644 drivers/usb/ulpi/omap-ulpi-viewport.c diff --git a/doc/README.omap-ulpi-viewport b/doc/README.omap-ulpi-viewport deleted file mode 100644 index a5240b9e295..00000000000 --- a/doc/README.omap-ulpi-viewport +++ /dev/null @@ -1,27 +0,0 @@ -Reference code ""drivers/usb/ulpi/omap-ulpi-viewport.c" - -Contains the ulpi read write api's to perform -any ulpi phy port access on omap platform. - -On omap ehci reg map contains INSNREG05_ULPI -register which offers the ulpi phy access so -any ulpi phy commands should be passsed using this -register. - -omap-ulpi-viewport.c is a low level function -implementation of "drivers/usb/ulpi/ulpi.c" - -To enable and use omap-ulpi-viewport.c -we require CONFIG_USB_ULPI_VIEWPORT_OMAP and -CONFIG_USB_ULPI be enabled in config file. - -Any ulpi ops request can be done with ulpi.c -and soc specific binding and usage is done with -omap-ulpi-viewport implementation. - -Ex: scenario: -omap-ehci driver code requests for ulpi phy reset if -ehci is used in phy mode, which will call ulpi phy reset -the ulpi phy reset does ulpi_read/write from viewport -implementation which will do ulpi reset using the -INSNREG05_ULPI register. diff --git a/drivers/usb/ulpi/Kconfig b/drivers/usb/ulpi/Kconfig index 001564d40c6..482114d6c11 100644 --- a/drivers/usb/ulpi/Kconfig +++ b/drivers/usb/ulpi/Kconfig @@ -14,11 +14,6 @@ config USB_ULPI_VIEWPORT Support generic ULPI Viewport implementation that is used on some Tegra and Snapdragon devices. -config USB_ULPI_VIEWPORT_OMAP - bool "OMAP ULPI Viewport" - help - Support ULPI Viewport implementation that is used on OMAP devices. - endchoice config USB_ULPI diff --git a/drivers/usb/ulpi/Makefile b/drivers/usb/ulpi/Makefile index f05b7743531..5565948bc12 100644 --- a/drivers/usb/ulpi/Makefile +++ b/drivers/usb/ulpi/Makefile @@ -4,4 +4,3 @@ obj-$(CONFIG_USB_ULPI) += ulpi.o obj-$(CONFIG_USB_ULPI_VIEWPORT) += ulpi-viewport.o -obj-$(CONFIG_USB_ULPI_VIEWPORT_OMAP) += omap-ulpi-viewport.o diff --git a/drivers/usb/ulpi/omap-ulpi-viewport.c b/drivers/usb/ulpi/omap-ulpi-viewport.c deleted file mode 100644 index 6f0c3eb154e..00000000000 --- a/drivers/usb/ulpi/omap-ulpi-viewport.c +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * OMAP ulpi viewport support - * Based on drivers/usb/ulpi/ulpi-viewport.c - * - * Copyright (C) 2011 Texas Instruments Incorporated - https://www.ti.com - * Author: Govindraj R - */ - -#include -#include -#include -#include - -#define OMAP_ULPI_WR_OPSEL (2 << 22) -#define OMAP_ULPI_RD_OPSEL (3 << 22) -#define OMAP_ULPI_START (1 << 31) - -/* - * Wait for having ulpi in done state - */ -static int ulpi_wait(struct ulpi_viewport *ulpi_vp, u32 mask) -{ - int timeout = CFG_USB_ULPI_TIMEOUT; - - while (--timeout) { - if (!(readl(ulpi_vp->viewport_addr) & mask)) - return 0; - - udelay(1); - } - - return ULPI_ERROR; -} - -/* - * Issue a ULPI read/write request - */ -static int ulpi_request(struct ulpi_viewport *ulpi_vp, u32 value) -{ - int err; - - writel(value, ulpi_vp->viewport_addr); - - err = ulpi_wait(ulpi_vp, OMAP_ULPI_START); - if (err) - debug("ULPI request timed out\n"); - - return err; -} - -int ulpi_write(struct ulpi_viewport *ulpi_vp, u8 *reg, u32 value) -{ - u32 val = OMAP_ULPI_START | (((ulpi_vp->port_num + 1) & 0xf) << 24) | - OMAP_ULPI_WR_OPSEL | ((u32)reg << 16) | (value & 0xff); - - return ulpi_request(ulpi_vp, val); -} - -u32 ulpi_read(struct ulpi_viewport *ulpi_vp, u8 *reg) -{ - int err; - u32 val = OMAP_ULPI_START | (((ulpi_vp->port_num + 1) & 0xf) << 24) | - OMAP_ULPI_RD_OPSEL | ((u32)reg << 16); - - err = ulpi_request(ulpi_vp, val); - if (err) - return err; - - return readl(ulpi_vp->viewport_addr) & 0xff; -} -- cgit v1.3.1 From 831a38483cf21b395bb0d9d7a34fb9b430e9bb86 Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Fri, 14 Mar 2025 19:27:36 -0600 Subject: usb: ulpi: Clean up how we enable support The way we enable ULPI support today isn't something that should work. The "optional" keyword in a choice statement is not a documented feature. To make this work in a supported way, make USB_ULPI something we ask about if USB_HOST is set. Next, we move the choice of what viewer to use to be after the framework portion and to depend on that. We then borrow a few words from the top-level README to make the help text here clearer. Finally we make the Qualcomm driver select ULPI as it's required and we make the tegra driver not duplicate a check that Kconfig now handles for us. Signed-off-by: Tom Rini --- README | 12 ------------ drivers/usb/host/Kconfig | 7 +++++-- drivers/usb/host/ehci-tegra.c | 7 ------- drivers/usb/ulpi/Kconfig | 23 ++++++++++++----------- 4 files changed, 17 insertions(+), 32 deletions(-) diff --git a/README b/README index 334bbcf0dd1..88b6e6f2772 100644 --- a/README +++ b/README @@ -482,18 +482,6 @@ The following options need to be configured: for your device - CONFIG_USBD_PRODUCTID 0xFFFF -- ULPI Layer Support: - The ULPI (UTMI Low Pin (count) Interface) PHYs are supported via - the generic ULPI layer. The generic layer accesses the ULPI PHY - via the platform viewport, so you need both the genric layer and - the viewport enabled. Currently only Chipidea/ARC based - viewport is supported. - To enable the ULPI layer support, define CONFIG_USB_ULPI and - CONFIG_USB_ULPI_VIEWPORT in your board configuration file. - If your ULPI phy needs a different reference clock than the - standard 24 MHz then you have to define CFG_ULPI_REF_CLK to - the appropriate value in Hz. - - MMC Support: CONFIG_SH_MMCIF Support for Renesas on-chip MMCIF controller diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 3dc79770eeb..5c9e8fc9d15 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -262,7 +262,7 @@ endif config USB_EHCI_MSM bool "Support for Qualcomm on-chip EHCI USB controller" depends on DM_USB - select USB_ULPI_VIEWPORT + select USB_ULPI select MSM8916_USB_PHY ---help--- Enables support for the on-chip EHCI controller on Qualcomm @@ -279,7 +279,10 @@ config USB_EHCI_TEGRA depends on ARCH_TEGRA select USB_EHCI_IS_TDI ---help--- - Enable support for Tegra on-chip EHCI USB controller + Enable support for Tegra on-chip EHCI USB controller. If you enable + ULPI and your PHY needs a different reference clock than the standard + 24 MHz then you have to define CFG_ULPI_REF_CLK to the appropriate + value in Hz. config USB_EHCI_ZYNQ bool "Support for Xilinx Zynq on-chip EHCI USB controller" diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index 7c73eb66b60..89b87886da1 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c @@ -25,13 +25,6 @@ #define HOSTPC1_DEVLC 0x84 #define HOSTPC1_PSPD(x) (((x) >> 25) & 0x3) -#ifdef CONFIG_USB_ULPI - #ifndef CONFIG_USB_ULPI_VIEWPORT - #error "To use CONFIG_USB_ULPI on Tegra Boards you have to also \ - define CONFIG_USB_ULPI_VIEWPORT" - #endif -#endif - /* Parameters we need for USB */ enum { PARAM_DIVN, /* PLL FEEDBACK DIVIDer */ diff --git a/drivers/usb/ulpi/Kconfig b/drivers/usb/ulpi/Kconfig index 482114d6c11..d969360f7eb 100644 --- a/drivers/usb/ulpi/Kconfig +++ b/drivers/usb/ulpi/Kconfig @@ -1,8 +1,18 @@ comment "ULPI drivers" +config USB_ULPI + bool "ULPI support" + depends on USB_HOST + help + Select to commnicate with USB PHY via ULPI interface. + The ULPI (UTMI Low Pin (count) Interface) is a wrapper on UTMI+ core + that is used as PHY Transreceiver for USB controllers. + + This driver uses ULPI viewports that are specific for each SoC. + choice prompt "ULPI Viewport type" - optional + depends on USB_ULPI help Select ULPI viewport (SoC-side interface to ULPI) implementation appropriate for the device if you want to communicate with @@ -10,18 +20,9 @@ choice config USB_ULPI_VIEWPORT bool "Generic ULPI Viewport" + depends on USB_ULPI help Support generic ULPI Viewport implementation that is used on some Tegra and Snapdragon devices. endchoice - -config USB_ULPI - bool "ULPI support" - depends on (USB_ULPI_VIEWPORT || USB_ULPI_VIEWPORT_OMAP) - help - Select to commnicate with USB PHY via ULPI interface. - ULPI is wrapper on UTMI+ core that is used as - PHY Transreceiver for USB controllers. - - This driver uses ULPI viewports that are specific for each SoC. -- cgit v1.3.1