184c7204bSMichal Simek /* 284c7204bSMichal Simek * (C) Copyright 2014 - 2015 Xilinx, Inc. 384c7204bSMichal Simek * Michal Simek <michal.simek@xilinx.com> 484c7204bSMichal Simek * 584c7204bSMichal Simek * SPDX-License-Identifier: GPL-2.0+ 684c7204bSMichal Simek */ 784c7204bSMichal Simek 884c7204bSMichal Simek #include <common.h> 9679b994aSMichal Simek #include <sata.h> 106fe6f135SMichal Simek #include <ahci.h> 116fe6f135SMichal Simek #include <scsi.h> 12b72894f1SMichal Simek #include <malloc.h> 130785dfd8SMichal Simek #include <asm/arch/clk.h> 1484c7204bSMichal Simek #include <asm/arch/hardware.h> 1584c7204bSMichal Simek #include <asm/arch/sys_proto.h> 1684c7204bSMichal Simek #include <asm/io.h> 1716fa00a7SSiva Durga Prasad Paladugu #include <usb.h> 1816fa00a7SSiva Durga Prasad Paladugu #include <dwc3-uboot.h> 1947e60cbdSMichal Simek #include <zynqmppl.h> 206919b4bfSMichal Simek #include <i2c.h> 219feff385SMichal Simek #include <g_dnl.h> 2284c7204bSMichal Simek 2384c7204bSMichal Simek DECLARE_GLOBAL_DATA_PTR; 2484c7204bSMichal Simek 2547e60cbdSMichal Simek #if defined(CONFIG_FPGA) && defined(CONFIG_FPGA_ZYNQMPPL) && \ 2647e60cbdSMichal Simek !defined(CONFIG_SPL_BUILD) 2747e60cbdSMichal Simek static xilinx_desc zynqmppl = XILINX_ZYNQMP_DESC; 2847e60cbdSMichal Simek 2947e60cbdSMichal Simek static const struct { 308ebdf9efSMichal Simek u32 id; 31*494fffe7SMichal Simek u32 ver; 3247e60cbdSMichal Simek char *name; 3347e60cbdSMichal Simek } zynqmp_devices[] = { 3447e60cbdSMichal Simek { 3547e60cbdSMichal Simek .id = 0x10, 3647e60cbdSMichal Simek .name = "3eg", 3747e60cbdSMichal Simek }, 3847e60cbdSMichal Simek { 39*494fffe7SMichal Simek .id = 0x10, 40*494fffe7SMichal Simek .ver = 0x2c, 41*494fffe7SMichal Simek .name = "3cg", 42*494fffe7SMichal Simek }, 43*494fffe7SMichal Simek { 4447e60cbdSMichal Simek .id = 0x11, 4547e60cbdSMichal Simek .name = "2eg", 4647e60cbdSMichal Simek }, 4747e60cbdSMichal Simek { 48*494fffe7SMichal Simek .id = 0x11, 49*494fffe7SMichal Simek .ver = 0x2c, 50*494fffe7SMichal Simek .name = "2cg", 51*494fffe7SMichal Simek }, 52*494fffe7SMichal Simek { 5347e60cbdSMichal Simek .id = 0x20, 5447e60cbdSMichal Simek .name = "5ev", 5547e60cbdSMichal Simek }, 5647e60cbdSMichal Simek { 57*494fffe7SMichal Simek .id = 0x20, 58*494fffe7SMichal Simek .ver = 0x100, 59*494fffe7SMichal Simek .name = "5eg", 60*494fffe7SMichal Simek }, 61*494fffe7SMichal Simek { 62*494fffe7SMichal Simek .id = 0x20, 63*494fffe7SMichal Simek .ver = 0x12c, 64*494fffe7SMichal Simek .name = "5cg", 65*494fffe7SMichal Simek }, 66*494fffe7SMichal Simek { 6747e60cbdSMichal Simek .id = 0x21, 6847e60cbdSMichal Simek .name = "4ev", 6947e60cbdSMichal Simek }, 7047e60cbdSMichal Simek { 71*494fffe7SMichal Simek .id = 0x21, 72*494fffe7SMichal Simek .ver = 0x100, 73*494fffe7SMichal Simek .name = "4eg", 74*494fffe7SMichal Simek }, 75*494fffe7SMichal Simek { 76*494fffe7SMichal Simek .id = 0x21, 77*494fffe7SMichal Simek .ver = 0x12c, 78*494fffe7SMichal Simek .name = "4cg", 79*494fffe7SMichal Simek }, 80*494fffe7SMichal Simek { 8147e60cbdSMichal Simek .id = 0x30, 8247e60cbdSMichal Simek .name = "7ev", 8347e60cbdSMichal Simek }, 8447e60cbdSMichal Simek { 85*494fffe7SMichal Simek .id = 0x30, 86*494fffe7SMichal Simek .ver = 0x100, 87*494fffe7SMichal Simek .name = "7eg", 88*494fffe7SMichal Simek }, 89*494fffe7SMichal Simek { 90*494fffe7SMichal Simek .id = 0x30, 91*494fffe7SMichal Simek .ver = 0x12c, 92*494fffe7SMichal Simek .name = "7cg", 93*494fffe7SMichal Simek }, 94*494fffe7SMichal Simek { 9547e60cbdSMichal Simek .id = 0x38, 9647e60cbdSMichal Simek .name = "9eg", 9747e60cbdSMichal Simek }, 9847e60cbdSMichal Simek { 99*494fffe7SMichal Simek .id = 0x38, 100*494fffe7SMichal Simek .ver = 0x2c, 101*494fffe7SMichal Simek .name = "9cg", 102*494fffe7SMichal Simek }, 103*494fffe7SMichal Simek { 10447e60cbdSMichal Simek .id = 0x39, 10547e60cbdSMichal Simek .name = "6eg", 10647e60cbdSMichal Simek }, 10747e60cbdSMichal Simek { 108*494fffe7SMichal Simek .id = 0x39, 109*494fffe7SMichal Simek .ver = 0x2c, 110*494fffe7SMichal Simek .name = "6cg", 111*494fffe7SMichal Simek }, 112*494fffe7SMichal Simek { 11347e60cbdSMichal Simek .id = 0x40, 11447e60cbdSMichal Simek .name = "11eg", 11547e60cbdSMichal Simek }, 116*494fffe7SMichal Simek { /* For testing purpose only */ 117*494fffe7SMichal Simek .id = 0x50, 118*494fffe7SMichal Simek .ver = 0x2c, 119*494fffe7SMichal Simek .name = "15cg", 120*494fffe7SMichal Simek }, 12147e60cbdSMichal Simek { 12247e60cbdSMichal Simek .id = 0x50, 12347e60cbdSMichal Simek .name = "15eg", 12447e60cbdSMichal Simek }, 12547e60cbdSMichal Simek { 12647e60cbdSMichal Simek .id = 0x58, 12747e60cbdSMichal Simek .name = "19eg", 12847e60cbdSMichal Simek }, 12947e60cbdSMichal Simek { 13047e60cbdSMichal Simek .id = 0x59, 13147e60cbdSMichal Simek .name = "17eg", 13247e60cbdSMichal Simek }, 13347e60cbdSMichal Simek }; 13474ba69dbSSiva Durga Prasad Paladugu #endif 13547e60cbdSMichal Simek 136f52bf5a3SSiva Durga Prasad Paladugu int chip_id(unsigned char id) 13747e60cbdSMichal Simek { 13847e60cbdSMichal Simek struct pt_regs regs; 13974ba69dbSSiva Durga Prasad Paladugu int val = -EINVAL; 14074ba69dbSSiva Durga Prasad Paladugu 14174ba69dbSSiva Durga Prasad Paladugu if (current_el() != 3) { 14247e60cbdSMichal Simek regs.regs[0] = ZYNQMP_SIP_SVC_CSU_DMA_CHIPID; 14347e60cbdSMichal Simek regs.regs[1] = 0; 14447e60cbdSMichal Simek regs.regs[2] = 0; 14547e60cbdSMichal Simek regs.regs[3] = 0; 14647e60cbdSMichal Simek 14747e60cbdSMichal Simek smc_call(®s); 14847e60cbdSMichal Simek 1490cba6abbSSoren Brinkmann /* 1500cba6abbSSoren Brinkmann * SMC returns: 1510cba6abbSSoren Brinkmann * regs[0][31:0] = status of the operation 1520cba6abbSSoren Brinkmann * regs[0][63:32] = CSU.IDCODE register 1530cba6abbSSoren Brinkmann * regs[1][31:0] = CSU.version register 154*494fffe7SMichal Simek * regs[1][63:32] = CSU.IDCODE2 register 1550cba6abbSSoren Brinkmann */ 156db3123b4SSiva Durga Prasad Paladugu switch (id) { 157db3123b4SSiva Durga Prasad Paladugu case IDCODE: 1580cba6abbSSoren Brinkmann regs.regs[0] = upper_32_bits(regs.regs[0]); 1590cba6abbSSoren Brinkmann regs.regs[0] &= ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK | 1600cba6abbSSoren Brinkmann ZYNQMP_CSU_IDCODE_SVD_MASK; 1610cba6abbSSoren Brinkmann regs.regs[0] >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT; 162db3123b4SSiva Durga Prasad Paladugu val = regs.regs[0]; 163db3123b4SSiva Durga Prasad Paladugu break; 164db3123b4SSiva Durga Prasad Paladugu case VERSION: 165db3123b4SSiva Durga Prasad Paladugu regs.regs[1] = lower_32_bits(regs.regs[1]); 166db3123b4SSiva Durga Prasad Paladugu regs.regs[1] &= ZYNQMP_CSU_SILICON_VER_MASK; 167db3123b4SSiva Durga Prasad Paladugu val = regs.regs[1]; 168db3123b4SSiva Durga Prasad Paladugu break; 169*494fffe7SMichal Simek case IDCODE2: 170*494fffe7SMichal Simek regs.regs[1] = lower_32_bits(regs.regs[1]); 171*494fffe7SMichal Simek regs.regs[1] >>= ZYNQMP_CSU_VERSION_EMPTY_SHIFT; 172*494fffe7SMichal Simek val = regs.regs[1]; 173*494fffe7SMichal Simek break; 174db3123b4SSiva Durga Prasad Paladugu default: 175db3123b4SSiva Durga Prasad Paladugu printf("%s, Invalid Req:0x%x\n", __func__, id); 176db3123b4SSiva Durga Prasad Paladugu } 17774ba69dbSSiva Durga Prasad Paladugu } else { 17874ba69dbSSiva Durga Prasad Paladugu switch (id) { 17974ba69dbSSiva Durga Prasad Paladugu case IDCODE: 18074ba69dbSSiva Durga Prasad Paladugu val = readl(ZYNQMP_CSU_IDCODE_ADDR); 18174ba69dbSSiva Durga Prasad Paladugu val &= ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK | 18274ba69dbSSiva Durga Prasad Paladugu ZYNQMP_CSU_IDCODE_SVD_MASK; 18374ba69dbSSiva Durga Prasad Paladugu val >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT; 18474ba69dbSSiva Durga Prasad Paladugu break; 18574ba69dbSSiva Durga Prasad Paladugu case VERSION: 18674ba69dbSSiva Durga Prasad Paladugu val = readl(ZYNQMP_CSU_VER_ADDR); 18774ba69dbSSiva Durga Prasad Paladugu val &= ZYNQMP_CSU_SILICON_VER_MASK; 18874ba69dbSSiva Durga Prasad Paladugu break; 18974ba69dbSSiva Durga Prasad Paladugu default: 19074ba69dbSSiva Durga Prasad Paladugu printf("%s, Invalid Req:0x%x\n", __func__, id); 19174ba69dbSSiva Durga Prasad Paladugu } 19274ba69dbSSiva Durga Prasad Paladugu } 1930cba6abbSSoren Brinkmann 194db3123b4SSiva Durga Prasad Paladugu return val; 19547e60cbdSMichal Simek } 19647e60cbdSMichal Simek 19774ba69dbSSiva Durga Prasad Paladugu #if defined(CONFIG_FPGA) && defined(CONFIG_FPGA_ZYNQMPPL) && \ 19874ba69dbSSiva Durga Prasad Paladugu !defined(CONFIG_SPL_BUILD) 19947e60cbdSMichal Simek static char *zynqmp_get_silicon_idcode_name(void) 20047e60cbdSMichal Simek { 201*494fffe7SMichal Simek u32 i, id, ver; 20247e60cbdSMichal Simek 203db3123b4SSiva Durga Prasad Paladugu id = chip_id(IDCODE); 204*494fffe7SMichal Simek ver = chip_id(IDCODE2); 205*494fffe7SMichal Simek 20647e60cbdSMichal Simek for (i = 0; i < ARRAY_SIZE(zynqmp_devices); i++) { 207*494fffe7SMichal Simek if (zynqmp_devices[i].id == id && zynqmp_devices[i].ver == ver) 20847e60cbdSMichal Simek return zynqmp_devices[i].name; 20947e60cbdSMichal Simek } 21047e60cbdSMichal Simek return "unknown"; 21147e60cbdSMichal Simek } 21247e60cbdSMichal Simek #endif 21347e60cbdSMichal Simek 214fb4000e8SMichal Simek int board_early_init_f(void) 215fb4000e8SMichal Simek { 216fb4000e8SMichal Simek #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_CLK_ZYNQMP) 217fb4000e8SMichal Simek zynqmp_pmufw_version(); 218fb4000e8SMichal Simek #endif 21955de0929SMichal Simek 220fd1b635cSMichal Simek #if defined(CONFIG_SPL_BUILD) || defined(CONFIG_ZYNQMP_PSU_INIT_ENABLED) 22155de0929SMichal Simek psu_init(); 22255de0929SMichal Simek #endif 22355de0929SMichal Simek 224fb4000e8SMichal Simek return 0; 225fb4000e8SMichal Simek } 226fb4000e8SMichal Simek 22747e60cbdSMichal Simek #define ZYNQMP_VERSION_SIZE 9 22847e60cbdSMichal Simek 22984c7204bSMichal Simek int board_init(void) 23084c7204bSMichal Simek { 231a0736efbSMichal Simek printf("EL Level:\tEL%d\n", current_el()); 232a0736efbSMichal Simek 23347e60cbdSMichal Simek #if defined(CONFIG_FPGA) && defined(CONFIG_FPGA_ZYNQMPPL) && \ 23447e60cbdSMichal Simek !defined(CONFIG_SPL_BUILD) || (defined(CONFIG_SPL_FPGA_SUPPORT) && \ 23547e60cbdSMichal Simek defined(CONFIG_SPL_BUILD)) 23647e60cbdSMichal Simek if (current_el() != 3) { 23747e60cbdSMichal Simek static char version[ZYNQMP_VERSION_SIZE]; 23847e60cbdSMichal Simek 239df1cd46fSHeinrich Schuchardt strncat(version, "xczu", 4); 24047e60cbdSMichal Simek zynqmppl.name = strncat(version, 24147e60cbdSMichal Simek zynqmp_get_silicon_idcode_name(), 242df1cd46fSHeinrich Schuchardt ZYNQMP_VERSION_SIZE - 5); 24347e60cbdSMichal Simek printf("Chip ID:\t%s\n", zynqmppl.name); 24447e60cbdSMichal Simek fpga_init(); 24547e60cbdSMichal Simek fpga_add(fpga_xilinx, &zynqmppl); 24647e60cbdSMichal Simek } 24747e60cbdSMichal Simek #endif 24847e60cbdSMichal Simek 24984c7204bSMichal Simek return 0; 25084c7204bSMichal Simek } 25184c7204bSMichal Simek 25284c7204bSMichal Simek int board_early_init_r(void) 25384c7204bSMichal Simek { 25484c7204bSMichal Simek u32 val; 25584c7204bSMichal Simek 25690a35db4SMichal Simek val = readl(&crlapb_base->timestamp_ref_ctrl); 25790a35db4SMichal Simek val &= ZYNQMP_CRL_APB_TIMESTAMP_REF_CTRL_CLKACT; 25890a35db4SMichal Simek 25990a35db4SMichal Simek if (current_el() == 3 && !val) { 26084c7204bSMichal Simek val = readl(&crlapb_base->timestamp_ref_ctrl); 26184c7204bSMichal Simek val |= ZYNQMP_CRL_APB_TIMESTAMP_REF_CTRL_CLKACT; 26284c7204bSMichal Simek writel(val, &crlapb_base->timestamp_ref_ctrl); 26384c7204bSMichal Simek 2640785dfd8SMichal Simek /* Program freq register in System counter */ 2650785dfd8SMichal Simek writel(zynqmp_get_system_timer_freq(), 2660785dfd8SMichal Simek &iou_scntr_secure->base_frequency_id_register); 2670785dfd8SMichal Simek /* And enable system counter */ 2680785dfd8SMichal Simek writel(ZYNQMP_IOU_SCNTR_COUNTER_CONTROL_REGISTER_EN, 2690785dfd8SMichal Simek &iou_scntr_secure->counter_control_register); 2700785dfd8SMichal Simek } 27184c7204bSMichal Simek return 0; 27284c7204bSMichal Simek } 27384c7204bSMichal Simek 2746919b4bfSMichal Simek int zynq_board_read_rom_ethaddr(unsigned char *ethaddr) 2756919b4bfSMichal Simek { 2766919b4bfSMichal Simek #if defined(CONFIG_ZYNQ_GEM_EEPROM_ADDR) && \ 2776919b4bfSMichal Simek defined(CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET) && \ 2786919b4bfSMichal Simek defined(CONFIG_ZYNQ_EEPROM_BUS) 2796919b4bfSMichal Simek i2c_set_bus_num(CONFIG_ZYNQ_EEPROM_BUS); 2806919b4bfSMichal Simek 2816919b4bfSMichal Simek if (eeprom_read(CONFIG_ZYNQ_GEM_EEPROM_ADDR, 2826919b4bfSMichal Simek CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET, 2836919b4bfSMichal Simek ethaddr, 6)) 2846919b4bfSMichal Simek printf("I2C EEPROM MAC address read failed\n"); 2856919b4bfSMichal Simek #endif 2866919b4bfSMichal Simek 2876919b4bfSMichal Simek return 0; 2886919b4bfSMichal Simek } 2896919b4bfSMichal Simek 2908d59d7f6SMichal Simek #if !defined(CONFIG_SYS_SDRAM_BASE) && !defined(CONFIG_SYS_SDRAM_SIZE) 29176b00acaSSimon Glass int dram_init_banksize(void) 292361a8799STom Rini { 293da3f003bSMichal Simek return fdtdec_setup_memory_banksize(); 2948d59d7f6SMichal Simek } 2958d59d7f6SMichal Simek 2968d59d7f6SMichal Simek int dram_init(void) 2978d59d7f6SMichal Simek { 298950f86caSNathan Rossi if (fdtdec_setup_memory_size() != 0) 299950f86caSNathan Rossi return -EINVAL; 3008d59d7f6SMichal Simek 3018d59d7f6SMichal Simek return 0; 3028d59d7f6SMichal Simek } 3038d59d7f6SMichal Simek #else 30484c7204bSMichal Simek int dram_init(void) 30584c7204bSMichal Simek { 30684c7204bSMichal Simek gd->ram_size = CONFIG_SYS_SDRAM_SIZE; 30784c7204bSMichal Simek 30884c7204bSMichal Simek return 0; 30984c7204bSMichal Simek } 3108d59d7f6SMichal Simek #endif 31184c7204bSMichal Simek 31284c7204bSMichal Simek void reset_cpu(ulong addr) 31384c7204bSMichal Simek { 31484c7204bSMichal Simek } 31584c7204bSMichal Simek 31684c7204bSMichal Simek int board_late_init(void) 31784c7204bSMichal Simek { 31884c7204bSMichal Simek u32 reg = 0; 31984c7204bSMichal Simek u8 bootmode; 320b72894f1SMichal Simek const char *mode; 321b72894f1SMichal Simek char *new_targets; 322b72894f1SMichal Simek 323b72894f1SMichal Simek if (!(gd->flags & GD_FLG_ENV_DEFAULT)) { 324b72894f1SMichal Simek debug("Saved variables - Skipping\n"); 325b72894f1SMichal Simek return 0; 326b72894f1SMichal Simek } 32784c7204bSMichal Simek 32884c7204bSMichal Simek reg = readl(&crlapb_base->boot_mode); 32947359a03SMichal Simek if (reg >> BOOT_MODE_ALT_SHIFT) 33047359a03SMichal Simek reg >>= BOOT_MODE_ALT_SHIFT; 33147359a03SMichal Simek 33284c7204bSMichal Simek bootmode = reg & BOOT_MODES_MASK; 33384c7204bSMichal Simek 334fb90917cSMichal Simek puts("Bootmode: "); 33584c7204bSMichal Simek switch (bootmode) { 336d58fc12eSMichal Simek case USB_MODE: 337d58fc12eSMichal Simek puts("USB_MODE\n"); 338d58fc12eSMichal Simek mode = "usb"; 339d58fc12eSMichal Simek break; 3400a5bcc8cSSiva Durga Prasad Paladugu case JTAG_MODE: 341fb90917cSMichal Simek puts("JTAG_MODE\n"); 342b72894f1SMichal Simek mode = "pxe dhcp"; 3430a5bcc8cSSiva Durga Prasad Paladugu break; 3440a5bcc8cSSiva Durga Prasad Paladugu case QSPI_MODE_24BIT: 3450a5bcc8cSSiva Durga Prasad Paladugu case QSPI_MODE_32BIT: 346b72894f1SMichal Simek mode = "qspi0"; 347fb90917cSMichal Simek puts("QSPI_MODE\n"); 3480a5bcc8cSSiva Durga Prasad Paladugu break; 34939c56f55SMichal Simek case EMMC_MODE: 35078678feeSMichal Simek puts("EMMC_MODE\n"); 351b72894f1SMichal Simek mode = "mmc0"; 35278678feeSMichal Simek break; 35378678feeSMichal Simek case SD_MODE: 354fb90917cSMichal Simek puts("SD_MODE\n"); 355b72894f1SMichal Simek mode = "mmc0"; 35684c7204bSMichal Simek break; 357e1992276SSiva Durga Prasad Paladugu case SD1_LSHFT_MODE: 358e1992276SSiva Durga Prasad Paladugu puts("LVL_SHFT_"); 359e1992276SSiva Durga Prasad Paladugu /* fall through */ 360af813acdSMichal Simek case SD_MODE1: 361fb90917cSMichal Simek puts("SD_MODE1\n"); 3622d9925bcSMichal Simek #if defined(CONFIG_ZYNQ_SDHCI0) && defined(CONFIG_ZYNQ_SDHCI1) 363b72894f1SMichal Simek mode = "mmc1"; 364b72894f1SMichal Simek #else 365b72894f1SMichal Simek mode = "mmc0"; 3662d9925bcSMichal Simek #endif 367af813acdSMichal Simek break; 368af813acdSMichal Simek case NAND_MODE: 369fb90917cSMichal Simek puts("NAND_MODE\n"); 370b72894f1SMichal Simek mode = "nand0"; 371af813acdSMichal Simek break; 37284c7204bSMichal Simek default: 373b72894f1SMichal Simek mode = ""; 37484c7204bSMichal Simek printf("Invalid Boot Mode:0x%x\n", bootmode); 37584c7204bSMichal Simek break; 37684c7204bSMichal Simek } 37784c7204bSMichal Simek 378b72894f1SMichal Simek /* 379b72894f1SMichal Simek * One terminating char + one byte for space between mode 380b72894f1SMichal Simek * and default boot_targets 381b72894f1SMichal Simek */ 382b72894f1SMichal Simek new_targets = calloc(1, strlen(mode) + 38300caae6dSSimon Glass strlen(env_get("boot_targets")) + 2); 384b72894f1SMichal Simek 38500caae6dSSimon Glass sprintf(new_targets, "%s %s", mode, env_get("boot_targets")); 386382bee57SSimon Glass env_set("boot_targets", new_targets); 387b72894f1SMichal Simek 38884c7204bSMichal Simek return 0; 38984c7204bSMichal Simek } 39084696ff5SSiva Durga Prasad Paladugu 39184696ff5SSiva Durga Prasad Paladugu int checkboard(void) 39284696ff5SSiva Durga Prasad Paladugu { 3935af08556SMichal Simek puts("Board: Xilinx ZynqMP\n"); 39484696ff5SSiva Durga Prasad Paladugu return 0; 39584696ff5SSiva Durga Prasad Paladugu } 39616fa00a7SSiva Durga Prasad Paladugu 39716fa00a7SSiva Durga Prasad Paladugu #ifdef CONFIG_USB_DWC3 398275bd6d1SMichal Simek static struct dwc3_device dwc3_device_data0 = { 39916fa00a7SSiva Durga Prasad Paladugu .maximum_speed = USB_SPEED_HIGH, 40016fa00a7SSiva Durga Prasad Paladugu .base = ZYNQMP_USB0_XHCI_BASEADDR, 40116fa00a7SSiva Durga Prasad Paladugu .dr_mode = USB_DR_MODE_PERIPHERAL, 40216fa00a7SSiva Durga Prasad Paladugu .index = 0, 40316fa00a7SSiva Durga Prasad Paladugu }; 40416fa00a7SSiva Durga Prasad Paladugu 405275bd6d1SMichal Simek static struct dwc3_device dwc3_device_data1 = { 406275bd6d1SMichal Simek .maximum_speed = USB_SPEED_HIGH, 407275bd6d1SMichal Simek .base = ZYNQMP_USB1_XHCI_BASEADDR, 408275bd6d1SMichal Simek .dr_mode = USB_DR_MODE_PERIPHERAL, 409275bd6d1SMichal Simek .index = 1, 410275bd6d1SMichal Simek }; 411275bd6d1SMichal Simek 4129feff385SMichal Simek int usb_gadget_handle_interrupts(int index) 41316fa00a7SSiva Durga Prasad Paladugu { 4149feff385SMichal Simek dwc3_uboot_handle_interrupt(index); 41516fa00a7SSiva Durga Prasad Paladugu return 0; 41616fa00a7SSiva Durga Prasad Paladugu } 41716fa00a7SSiva Durga Prasad Paladugu 41816fa00a7SSiva Durga Prasad Paladugu int board_usb_init(int index, enum usb_init_type init) 41916fa00a7SSiva Durga Prasad Paladugu { 420275bd6d1SMichal Simek debug("%s: index %x\n", __func__, index); 421275bd6d1SMichal Simek 4228ecd50c8SMichal Simek #if defined(CONFIG_USB_GADGET_DOWNLOAD) 4238ecd50c8SMichal Simek g_dnl_set_serialnumber(CONFIG_SYS_CONFIG_NAME); 4248ecd50c8SMichal Simek #endif 4258ecd50c8SMichal Simek 426275bd6d1SMichal Simek switch (index) { 427275bd6d1SMichal Simek case 0: 428275bd6d1SMichal Simek return dwc3_uboot_init(&dwc3_device_data0); 429275bd6d1SMichal Simek case 1: 430275bd6d1SMichal Simek return dwc3_uboot_init(&dwc3_device_data1); 431275bd6d1SMichal Simek }; 432275bd6d1SMichal Simek 433275bd6d1SMichal Simek return -1; 43416fa00a7SSiva Durga Prasad Paladugu } 43516fa00a7SSiva Durga Prasad Paladugu 43616fa00a7SSiva Durga Prasad Paladugu int board_usb_cleanup(int index, enum usb_init_type init) 43716fa00a7SSiva Durga Prasad Paladugu { 43816fa00a7SSiva Durga Prasad Paladugu dwc3_uboot_exit(index); 43916fa00a7SSiva Durga Prasad Paladugu return 0; 44016fa00a7SSiva Durga Prasad Paladugu } 44116fa00a7SSiva Durga Prasad Paladugu #endif 442