Hi Marek,

Thank you for the patch.

On dim., mars 17, 2024 at 05:42, Marek Vasut <marek.vasut+rene...@mailbox.org> 
wrote:

> The dm_usb_gadget_handle_interrupts() has no place in board code. Move
> this into DWC3 driver. The OMAP implementation is special, add new weak
> dwc3_uboot_interrupt_status() function to decide whether DWC3 interrupt
> handling should be called, and override it in OMAP DWC3 code, to repair
> the special OMAP interrupt handling code until OMAP gets switched over
> to DM UDC proper.
>
> Signed-off-by: Marek Vasut <marek.vasut+rene...@mailbox.org>

Reviewed-by: Mattijs Korpershoek <mkorpersh...@baylibre.com>

Tested that I could scan for usb mass storage and that I can use
fastboot:

=> fastboot usb 0
crq->brequest:0x0
=> usb start
starting USB...
Bus usb@ff500000: Register 3000140 NbrPorts 3
Starting the controller
USB XHCI 1.10
scanning bus usb@ff500000 for devices... 3 USB Device(s) found
       scanning usb for storage devices... 1 Storage Device(s) found

=> usb storage
  Device 0: Vendor: SanDisk Rev: 1.00 Prod: Ultra
            Type: Removable Hard Disk
            Capacity: 29328.0 MB = 28.6 GB (60063744 x 512)

Tested-by: Mattijs Korpershoek <mkorpersh...@baylibre.com> # vim3

> ---
> Cc: Angus Ainslie <an...@akkea.ca>
> Cc: Caleb Connolly <caleb.conno...@linaro.org>
> Cc: Eugen Hristev <eugen.hris...@collabora.com>
> Cc: Igor Prusov <ivpru...@salutedevices.com>
> Cc: Mattijs Korpershoek <mkorpersh...@baylibre.com>
> Cc: Nishanth Menon <n...@ti.com>
> Cc: Patrice Chotard <patrice.chot...@foss.st.com>
> Cc: Simon Glass <s...@chromium.org>
> Cc: Stefan Bosch <stefa...@posteo.net>
> Cc: Svyatoslav Ryhel <clamo...@gmail.com>
> Cc: Tom Rini <tr...@konsulko.com>
> Cc: ker...@puri.sm
> ---
>  board/purism/librem5/spl.c        |  6 ------
>  board/samsung/common/exynos5-dt.c |  6 ------
>  board/st/stih410-b2260/board.c    |  6 ------
>  board/ti/am43xx/board.c           | 11 -----------
>  drivers/usb/dwc3/core.c           | 25 +++++++++++++++++++++----
>  drivers/usb/dwc3/dwc3-omap.c      |  4 ++--
>  include/dwc3-omap-uboot.h         |  1 -
>  include/dwc3-uboot.h              |  1 +
>  8 files changed, 24 insertions(+), 36 deletions(-)
>
> diff --git a/board/purism/librem5/spl.c b/board/purism/librem5/spl.c
> index 581f0929662..9aadc553302 100644
> --- a/board/purism/librem5/spl.c
> +++ b/board/purism/librem5/spl.c
> @@ -418,12 +418,6 @@ out:
>       return rv;
>  }
>  
> -int dm_usb_gadget_handle_interrupts(struct udevice *dev)
> -{
> -     dwc3_uboot_handle_interrupt(dev);
> -     return 0;
> -}
> -
>  static void dwc3_nxp_usb_phy_init(struct dwc3_device *dwc3)
>  {
>       u32 RegData;
> diff --git a/board/samsung/common/exynos5-dt.c 
> b/board/samsung/common/exynos5-dt.c
> index 95cf6d2acc2..b3e87c93751 100644
> --- a/board/samsung/common/exynos5-dt.c
> +++ b/board/samsung/common/exynos5-dt.c
> @@ -122,12 +122,6 @@ static struct dwc3_device dwc3_device_data = {
>       .index = 0,
>  };
>  
> -int dm_usb_gadget_handle_interrupts(struct udevice *dev)
> -{
> -     dwc3_uboot_handle_interrupt(dev);
> -     return 0;
> -}
> -
>  int board_usb_init(int index, enum usb_init_type init)
>  {
>       struct exynos_usb3_phy *phy = (struct exynos_usb3_phy *)
> diff --git a/board/st/stih410-b2260/board.c b/board/st/stih410-b2260/board.c
> index e21cbc270e9..82817571ae3 100644
> --- a/board/st/stih410-b2260/board.c
> +++ b/board/st/stih410-b2260/board.c
> @@ -50,12 +50,6 @@ static struct dwc3_device dwc3_device_data = {
>       .index = 0,
>  };
>  
> -int dm_usb_gadget_handle_interrupts(struct udevice *dev)
> -{
> -     dwc3_uboot_handle_interrupt(dev);
> -     return 0;
> -}
> -
>  int board_usb_init(int index, enum usb_init_type init)
>  {
>       int node;
> diff --git a/board/ti/am43xx/board.c b/board/ti/am43xx/board.c
> index ea0d0b92088..a4679a2e294 100644
> --- a/board/ti/am43xx/board.c
> +++ b/board/ti/am43xx/board.c
> @@ -759,17 +759,6 @@ static struct ti_usb_phy_device usb_phy2_device = {
>       .usb2_phy_power = (void *)USB2_PHY2_POWER,
>       .index = 1,
>  };
> -
> -int dm_usb_gadget_handle_interrupts(struct udevice *dev)
> -{
> -     u32 status;
> -
> -     status = dwc3_omap_uboot_interrupt_status(dev);
> -     if (status)
> -             dwc3_uboot_handle_interrupt(dev);
> -
> -     return 0;
> -}
>  #endif /* CONFIG_USB_DWC3 */
>  
>  #if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index 4b4fcd8a22e..09737be9a9c 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -983,6 +983,11 @@ void dwc3_uboot_exit(int index)
>       }
>  }
>  
> +MODULE_ALIAS("platform:dwc3");
> +MODULE_AUTHOR("Felipe Balbi <ba...@ti.com>");
> +MODULE_LICENSE("GPL v2");
> +MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver");
> +
>  /**
>   * dwc3_uboot_handle_interrupt - handle dwc3 core interrupt
>   * @dev: device of this controller
> @@ -1004,10 +1009,22 @@ void dwc3_uboot_handle_interrupt(struct udevice *dev)
>       }
>  }
>  
> -MODULE_ALIAS("platform:dwc3");
> -MODULE_AUTHOR("Felipe Balbi <ba...@ti.com>");
> -MODULE_LICENSE("GPL v2");
> -MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver");
> +#if !CONFIG_IS_ENABLED(DM_USB_GADGET)
> +__weak int dwc3_uboot_interrupt_status(struct udevice *dev)
> +{
> +     return 1;
> +}
> +
> +int dm_usb_gadget_handle_interrupts(struct udevice *dev)
> +{
> +     if (!dwc3_uboot_interrupt_status(dev))
> +             return 0;
> +
> +     dwc3_uboot_handle_interrupt(dev);
> +
> +     return 0;
> +}
> +#endif
>  
>  #if CONFIG_IS_ENABLED(PHY) && CONFIG_IS_ENABLED(DM_USB)
>  int dwc3_setup_phy(struct udevice *dev, struct phy_bulk *phys)
> diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c
> index 4fadb4a3e20..53c4d4826b4 100644
> --- a/drivers/usb/dwc3/dwc3-omap.c
> +++ b/drivers/usb/dwc3/dwc3-omap.c
> @@ -428,7 +428,7 @@ void dwc3_omap_uboot_exit(int index)
>  }
>  
>  /**
> - * dwc3_omap_uboot_interrupt_status - check the status of interrupt
> + * dwc3_uboot_interrupt_status - check the status of interrupt
>   * @dev: device of this controller
>   *
>   * Checks the status of interrupts and returns true if an interrupt
> @@ -436,7 +436,7 @@ void dwc3_omap_uboot_exit(int index)
>   *
>   * Generally called from board file.
>   */
> -int dwc3_omap_uboot_interrupt_status(struct udevice *dev)
> +int dwc3_uboot_interrupt_status(struct udevice *dev)
>  {
>       struct dwc3_omap *omap = NULL;
>  
> diff --git a/include/dwc3-omap-uboot.h b/include/dwc3-omap-uboot.h
> index ed92bfc5a97..f220705ef7b 100644
> --- a/include/dwc3-omap-uboot.h
> +++ b/include/dwc3-omap-uboot.h
> @@ -27,5 +27,4 @@ struct dwc3_omap_device {
>  
>  int dwc3_omap_uboot_init(struct dwc3_omap_device *dev);
>  void dwc3_omap_uboot_exit(int index);
> -int dwc3_omap_uboot_interrupt_status(struct udevice *dev);
>  #endif /* __DWC3_OMAP_UBOOT_H_ */
> diff --git a/include/dwc3-uboot.h b/include/dwc3-uboot.h
> index 35cfbb93b29..5f13f5bcf40 100644
> --- a/include/dwc3-uboot.h
> +++ b/include/dwc3-uboot.h
> @@ -44,6 +44,7 @@ struct dwc3_device {
>  
>  int dwc3_uboot_init(struct dwc3_device *dev);
>  void dwc3_uboot_exit(int index);
> +int dwc3_uboot_interrupt_status(struct udevice *dev);
>  void dwc3_uboot_handle_interrupt(struct udevice *dev);
>  
>  struct phy;
> -- 
> 2.43.0

Reply via email to