Hi Rajat,

> Implements the dwc3 gadget driver support for LS1043
> platform, and performs below operations:
> 1. Enables snooping support for DWC3 controller.
> 2. Enables cache coherency in LS1043 platform.
> 
> Signed-off-by: Rajat Srivastava <rajat.srivast...@nxp.com>
> Signed-off-by: Rajesh Bhagat <rajesh.bha...@nxp.com>
> Reviewed-by: Lukasz Majewski <l.majew...@samsung.com>
> ---
> Changes in v2:
>  - Moves DWC3 driver specific code to helper functions
>  - Calls helper functions in SoC specific implementation 
> 
>  arch/arm/cpu/armv8/fsl-layerscape/soc.c            | 93
> ++++++++++++++++++++++ .../include/asm/arch-fsl-layerscape/immap_lsch2.h
> |  6 ++ 2 files changed, 99 insertions(+)
> 
> diff --git a/arch/arm/cpu/armv8/fsl-layerscape/soc.c
> b/arch/arm/cpu/armv8/fsl-layerscape/soc.c index 0fb5c7f..cc07524
> 100644 --- a/arch/arm/cpu/armv8/fsl-layerscape/soc.c
> +++ b/arch/arm/cpu/armv8/fsl-layerscape/soc.c
> @@ -17,6 +17,10 @@
>  #ifdef CONFIG_CHAIN_OF_TRUST
>  #include <fsl_validate.h>
>  #endif
> +#include <usb.h>
> +#include <dwc3-uboot.h>
> +#include <linux/usb/xhci-fsl.h>
> +
>  
>  DECLARE_GLOBAL_DATA_PTR;
>  
> @@ -318,9 +322,18 @@ void fsl_lsch2_early_init_f(void)
>  #if defined(CONFIG_FSL_QSPI) && !defined(CONFIG_QSPI_BOOT)
>       out_be32(&scfg->qspi_cfg, SCFG_QSPI_CLKSEL);
>  #endif
> +     /* Make SEC and USB reads and writes snoopable */
> +#if defined(CONFIG_LS1043A)
> +     setbits_be32(&scfg->snpcnfgcr, SCFG_SNPCNFGCR_SECRDSNP |
> +                  SCFG_SNPCNFGCR_SECWRSNP |
> SCFG_SNPCNFGCR_USB1RDSNP |
> +                  SCFG_SNPCNFGCR_USB1WRSNP |
> SCFG_SNPCNFGCR_USB2RDSNP |
> +                  SCFG_SNPCNFGCR_USB2WRSNP |
> SCFG_SNPCNFGCR_USB3RDSNP |
> +                  SCFG_SNPCNFGCR_USB3WRSNP);
> +#else
>       /* Make SEC reads and writes snoopable */
>       setbits_be32(&scfg->snpcnfgcr, SCFG_SNPCNFGCR_SECRDSNP |
>                    SCFG_SNPCNFGCR_SECWRSNP);
> +#endif
>  
>       /*
>        * Enable snoop requests and DVM message requests for
> @@ -336,6 +349,86 @@ void fsl_lsch2_early_init_f(void)
>  }
>  #endif
>  
> +#ifdef CONFIG_USB_DWC3
> +
> +#if defined(CONFIG_LS1043A)
> +static struct dwc3_device dwc3_device_data0 = {
> +     .maximum_speed = USB_SPEED_HIGH,
> +     .base = CONFIG_SYS_FSL_XHCI_USB1_ADDR,
> +     .dr_mode = USB_DR_MODE_PERIPHERAL,
> +     .index = 0,
> +};
> +
> +static struct dwc3_device dwc3_device_data1 = {
> +     .maximum_speed = USB_SPEED_HIGH,
> +     .base = CONFIG_SYS_FSL_XHCI_USB2_ADDR,
> +     .dr_mode = USB_DR_MODE_PERIPHERAL,
> +     .index = 1,
> +};
> +
> +static struct dwc3_device dwc3_device_data2 = {
> +     .maximum_speed = USB_SPEED_HIGH,
> +     .base = CONFIG_SYS_FSL_XHCI_USB3_ADDR,
> +     .dr_mode = USB_DR_MODE_PERIPHERAL,
> +     .index = 2,
> +};
> +
> +int usb_gadget_handle_interrupts(int index)
> +{
> +     dwc3_uboot_handle_interrupt(index);
> +     return 0;
> +}
> +#endif
> +
> +int board_usb_init(int index, enum usb_init_type init)

Are those usb related functions generic? To ask in another way, would
it be possible to reuse those functions for other armv8 boards?

Please correct me if I'm wrong, but it seems that LS1043 is a single
board. Maybe it would be better to place this code in a
separate ./board/nxp/ls1043 directory?

> +{
> +     switch (init) {
> +     case USB_INIT_DEVICE:
> +             switch (index) {
> +#if defined(CONFIG_LS1043A)
> +             case 0:
> +                     dwc3_uboot_init(&dwc3_device_data0);
> +                     break;
> +             case 1:
> +                     dwc3_uboot_init(&dwc3_device_data1);
> +                     break;
> +             case 2:
> +                     dwc3_uboot_init(&dwc3_device_data2);
> +                     break;
> +#endif
> +             default:
> +                     printf("Invalid Controller Index\n");
> +                     return -1;
> +             }
> +#if defined(CONFIG_LS1043A)
> +             dwc3_core_incr_burst_enable(index, 0xf, 0xf);
> +             dwc3_core_set_snooping(index, true);
> +#endif
> +             break;
> +     default:
> +             break;
> +     }
> +
> +     return 0;
> +}
> +
> +int board_usb_cleanup(int index, enum usb_init_type init)
> +{
> +     switch (init) {
> +     case USB_INIT_DEVICE:
> +#if defined(CONFIG_LS1043A)
> +             dwc3_uboot_exit(index);
> +#endif
> +             break;
> +     default:
> +             break;
> +     }
> +     return 0;
> +}
> +#endif
> +
> +
> +
>  #ifdef CONFIG_BOARD_LATE_INIT
>  int board_late_init(void)
>  {
> diff --git a/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h
> b/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h index
> 57b99d4..13ba1a6 100644 ---
> a/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h +++
> b/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h @@ -328,6
> +328,12 @@ struct ccsr_gur { 
>  #define SCFG_SNPCNFGCR_SECRDSNP              0x80000000
>  #define SCFG_SNPCNFGCR_SECWRSNP              0x40000000
> +#define SCFG_SNPCNFGCR_USB1RDSNP     0x00200000
> +#define SCFG_SNPCNFGCR_USB1WRSNP     0x00100000
> +#define SCFG_SNPCNFGCR_USB2RDSNP     0x00008000
> +#define SCFG_SNPCNFGCR_USB2WRSNP     0x00010000
> +#define SCFG_SNPCNFGCR_USB3RDSNP     0x00002000
> +#define SCFG_SNPCNFGCR_USB3WRSNP     0x00004000
>  
>  /* Supplemental Configuration Unit */
>  struct ccsr_scfg {



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to