18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/arch/arm/mach-mmp/devices.c 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include <linux/init.h> 78c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 88c2ecf20Sopenharmony_ci#include <linux/dma-mapping.h> 98c2ecf20Sopenharmony_ci#include <linux/delay.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <asm/irq.h> 128c2ecf20Sopenharmony_ci#include "irqs.h" 138c2ecf20Sopenharmony_ci#include "devices.h" 148c2ecf20Sopenharmony_ci#include <linux/soc/mmp/cputype.h> 158c2ecf20Sopenharmony_ci#include "regs-usb.h" 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ciint __init pxa_register_device(struct pxa_device_desc *desc, 188c2ecf20Sopenharmony_ci void *data, size_t size) 198c2ecf20Sopenharmony_ci{ 208c2ecf20Sopenharmony_ci struct platform_device *pdev; 218c2ecf20Sopenharmony_ci struct resource res[2 + MAX_RESOURCE_DMA]; 228c2ecf20Sopenharmony_ci int i, ret = 0, nres = 0; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci pdev = platform_device_alloc(desc->drv_name, desc->id); 258c2ecf20Sopenharmony_ci if (pdev == NULL) 268c2ecf20Sopenharmony_ci return -ENOMEM; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32); 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci memset(res, 0, sizeof(res)); 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci if (desc->start != -1ul && desc->size > 0) { 338c2ecf20Sopenharmony_ci res[nres].start = desc->start; 348c2ecf20Sopenharmony_ci res[nres].end = desc->start + desc->size - 1; 358c2ecf20Sopenharmony_ci res[nres].flags = IORESOURCE_MEM; 368c2ecf20Sopenharmony_ci nres++; 378c2ecf20Sopenharmony_ci } 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci if (desc->irq != NO_IRQ) { 408c2ecf20Sopenharmony_ci res[nres].start = desc->irq; 418c2ecf20Sopenharmony_ci res[nres].end = desc->irq; 428c2ecf20Sopenharmony_ci res[nres].flags = IORESOURCE_IRQ; 438c2ecf20Sopenharmony_ci nres++; 448c2ecf20Sopenharmony_ci } 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci for (i = 0; i < MAX_RESOURCE_DMA; i++, nres++) { 478c2ecf20Sopenharmony_ci if (desc->dma[i] == 0) 488c2ecf20Sopenharmony_ci break; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci res[nres].start = desc->dma[i]; 518c2ecf20Sopenharmony_ci res[nres].end = desc->dma[i]; 528c2ecf20Sopenharmony_ci res[nres].flags = IORESOURCE_DMA; 538c2ecf20Sopenharmony_ci } 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci ret = platform_device_add_resources(pdev, res, nres); 568c2ecf20Sopenharmony_ci if (ret) { 578c2ecf20Sopenharmony_ci platform_device_put(pdev); 588c2ecf20Sopenharmony_ci return ret; 598c2ecf20Sopenharmony_ci } 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci if (data && size) { 628c2ecf20Sopenharmony_ci ret = platform_device_add_data(pdev, data, size); 638c2ecf20Sopenharmony_ci if (ret) { 648c2ecf20Sopenharmony_ci platform_device_put(pdev); 658c2ecf20Sopenharmony_ci return ret; 668c2ecf20Sopenharmony_ci } 678c2ecf20Sopenharmony_ci } 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci return platform_device_add(pdev); 708c2ecf20Sopenharmony_ci} 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_USB) || IS_ENABLED(CONFIG_USB_GADGET) 738c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_USB_MV_UDC) || IS_ENABLED(CONFIG_USB_EHCI_MV) 748c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_CPU_PXA910) || IS_ENABLED(CONFIG_CPU_PXA168) 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci/***************************************************************************** 778c2ecf20Sopenharmony_ci * The registers read/write routines 788c2ecf20Sopenharmony_ci *****************************************************************************/ 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_cistatic unsigned int u2o_get(void __iomem *base, unsigned int offset) 818c2ecf20Sopenharmony_ci{ 828c2ecf20Sopenharmony_ci return readl_relaxed(base + offset); 838c2ecf20Sopenharmony_ci} 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_cistatic void u2o_set(void __iomem *base, unsigned int offset, 868c2ecf20Sopenharmony_ci unsigned int value) 878c2ecf20Sopenharmony_ci{ 888c2ecf20Sopenharmony_ci u32 reg; 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci reg = readl_relaxed(base + offset); 918c2ecf20Sopenharmony_ci reg |= value; 928c2ecf20Sopenharmony_ci writel_relaxed(reg, base + offset); 938c2ecf20Sopenharmony_ci readl_relaxed(base + offset); 948c2ecf20Sopenharmony_ci} 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_cistatic void u2o_clear(void __iomem *base, unsigned int offset, 978c2ecf20Sopenharmony_ci unsigned int value) 988c2ecf20Sopenharmony_ci{ 998c2ecf20Sopenharmony_ci u32 reg; 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci reg = readl_relaxed(base + offset); 1028c2ecf20Sopenharmony_ci reg &= ~value; 1038c2ecf20Sopenharmony_ci writel_relaxed(reg, base + offset); 1048c2ecf20Sopenharmony_ci readl_relaxed(base + offset); 1058c2ecf20Sopenharmony_ci} 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_cistatic void u2o_write(void __iomem *base, unsigned int offset, 1088c2ecf20Sopenharmony_ci unsigned int value) 1098c2ecf20Sopenharmony_ci{ 1108c2ecf20Sopenharmony_ci writel_relaxed(value, base + offset); 1118c2ecf20Sopenharmony_ci readl_relaxed(base + offset); 1128c2ecf20Sopenharmony_ci} 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_cistatic DEFINE_MUTEX(phy_lock); 1168c2ecf20Sopenharmony_cistatic int phy_init_cnt; 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_cistatic int usb_phy_init_internal(void __iomem *base) 1198c2ecf20Sopenharmony_ci{ 1208c2ecf20Sopenharmony_ci int loops; 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ci pr_info("Init usb phy!!!\n"); 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ci /* Initialize the USB PHY power */ 1258c2ecf20Sopenharmony_ci if (cpu_is_pxa910()) { 1268c2ecf20Sopenharmony_ci u2o_set(base, UTMI_CTRL, (1<<UTMI_CTRL_INPKT_DELAY_SOF_SHIFT) 1278c2ecf20Sopenharmony_ci | (1<<UTMI_CTRL_PU_REF_SHIFT)); 1288c2ecf20Sopenharmony_ci } 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci u2o_set(base, UTMI_CTRL, 1<<UTMI_CTRL_PLL_PWR_UP_SHIFT); 1318c2ecf20Sopenharmony_ci u2o_set(base, UTMI_CTRL, 1<<UTMI_CTRL_PWR_UP_SHIFT); 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci /* UTMI_PLL settings */ 1348c2ecf20Sopenharmony_ci u2o_clear(base, UTMI_PLL, UTMI_PLL_PLLVDD18_MASK 1358c2ecf20Sopenharmony_ci | UTMI_PLL_PLLVDD12_MASK | UTMI_PLL_PLLCALI12_MASK 1368c2ecf20Sopenharmony_ci | UTMI_PLL_FBDIV_MASK | UTMI_PLL_REFDIV_MASK 1378c2ecf20Sopenharmony_ci | UTMI_PLL_ICP_MASK | UTMI_PLL_KVCO_MASK); 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci u2o_set(base, UTMI_PLL, 0xee<<UTMI_PLL_FBDIV_SHIFT 1408c2ecf20Sopenharmony_ci | 0xb<<UTMI_PLL_REFDIV_SHIFT | 3<<UTMI_PLL_PLLVDD18_SHIFT 1418c2ecf20Sopenharmony_ci | 3<<UTMI_PLL_PLLVDD12_SHIFT | 3<<UTMI_PLL_PLLCALI12_SHIFT 1428c2ecf20Sopenharmony_ci | 1<<UTMI_PLL_ICP_SHIFT | 3<<UTMI_PLL_KVCO_SHIFT); 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci /* UTMI_TX */ 1458c2ecf20Sopenharmony_ci u2o_clear(base, UTMI_TX, UTMI_TX_REG_EXT_FS_RCAL_EN_MASK 1468c2ecf20Sopenharmony_ci | UTMI_TX_TXVDD12_MASK | UTMI_TX_CK60_PHSEL_MASK 1478c2ecf20Sopenharmony_ci | UTMI_TX_IMPCAL_VTH_MASK | UTMI_TX_REG_EXT_FS_RCAL_MASK 1488c2ecf20Sopenharmony_ci | UTMI_TX_AMP_MASK); 1498c2ecf20Sopenharmony_ci u2o_set(base, UTMI_TX, 3<<UTMI_TX_TXVDD12_SHIFT 1508c2ecf20Sopenharmony_ci | 4<<UTMI_TX_CK60_PHSEL_SHIFT | 4<<UTMI_TX_IMPCAL_VTH_SHIFT 1518c2ecf20Sopenharmony_ci | 8<<UTMI_TX_REG_EXT_FS_RCAL_SHIFT | 3<<UTMI_TX_AMP_SHIFT); 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ci /* UTMI_RX */ 1548c2ecf20Sopenharmony_ci u2o_clear(base, UTMI_RX, UTMI_RX_SQ_THRESH_MASK 1558c2ecf20Sopenharmony_ci | UTMI_REG_SQ_LENGTH_MASK); 1568c2ecf20Sopenharmony_ci u2o_set(base, UTMI_RX, 7<<UTMI_RX_SQ_THRESH_SHIFT 1578c2ecf20Sopenharmony_ci | 2<<UTMI_REG_SQ_LENGTH_SHIFT); 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_ci /* UTMI_IVREF */ 1608c2ecf20Sopenharmony_ci if (cpu_is_pxa168()) 1618c2ecf20Sopenharmony_ci /* fixing Microsoft Altair board interface with NEC hub issue - 1628c2ecf20Sopenharmony_ci * Set UTMI_IVREF from 0x4a3 to 0x4bf */ 1638c2ecf20Sopenharmony_ci u2o_write(base, UTMI_IVREF, 0x4bf); 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_ci /* toggle VCOCAL_START bit of UTMI_PLL */ 1668c2ecf20Sopenharmony_ci udelay(200); 1678c2ecf20Sopenharmony_ci u2o_set(base, UTMI_PLL, VCOCAL_START); 1688c2ecf20Sopenharmony_ci udelay(40); 1698c2ecf20Sopenharmony_ci u2o_clear(base, UTMI_PLL, VCOCAL_START); 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci /* toggle REG_RCAL_START bit of UTMI_TX */ 1728c2ecf20Sopenharmony_ci udelay(400); 1738c2ecf20Sopenharmony_ci u2o_set(base, UTMI_TX, REG_RCAL_START); 1748c2ecf20Sopenharmony_ci udelay(40); 1758c2ecf20Sopenharmony_ci u2o_clear(base, UTMI_TX, REG_RCAL_START); 1768c2ecf20Sopenharmony_ci udelay(400); 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ci /* Make sure PHY PLL is ready */ 1798c2ecf20Sopenharmony_ci loops = 0; 1808c2ecf20Sopenharmony_ci while ((u2o_get(base, UTMI_PLL) & PLL_READY) == 0) { 1818c2ecf20Sopenharmony_ci mdelay(1); 1828c2ecf20Sopenharmony_ci loops++; 1838c2ecf20Sopenharmony_ci if (loops > 100) { 1848c2ecf20Sopenharmony_ci printk(KERN_WARNING "calibrate timeout, UTMI_PLL %x\n", 1858c2ecf20Sopenharmony_ci u2o_get(base, UTMI_PLL)); 1868c2ecf20Sopenharmony_ci break; 1878c2ecf20Sopenharmony_ci } 1888c2ecf20Sopenharmony_ci } 1898c2ecf20Sopenharmony_ci 1908c2ecf20Sopenharmony_ci if (cpu_is_pxa168()) { 1918c2ecf20Sopenharmony_ci u2o_set(base, UTMI_RESERVE, 1 << 5); 1928c2ecf20Sopenharmony_ci /* Turn on UTMI PHY OTG extension */ 1938c2ecf20Sopenharmony_ci u2o_write(base, UTMI_OTG_ADDON, 1); 1948c2ecf20Sopenharmony_ci } 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ci return 0; 1978c2ecf20Sopenharmony_ci} 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_cistatic int usb_phy_deinit_internal(void __iomem *base) 2008c2ecf20Sopenharmony_ci{ 2018c2ecf20Sopenharmony_ci pr_info("Deinit usb phy!!!\n"); 2028c2ecf20Sopenharmony_ci 2038c2ecf20Sopenharmony_ci if (cpu_is_pxa168()) 2048c2ecf20Sopenharmony_ci u2o_clear(base, UTMI_OTG_ADDON, UTMI_OTG_ADDON_OTG_ON); 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci u2o_clear(base, UTMI_CTRL, UTMI_CTRL_RXBUF_PDWN); 2078c2ecf20Sopenharmony_ci u2o_clear(base, UTMI_CTRL, UTMI_CTRL_TXBUF_PDWN); 2088c2ecf20Sopenharmony_ci u2o_clear(base, UTMI_CTRL, UTMI_CTRL_USB_CLK_EN); 2098c2ecf20Sopenharmony_ci u2o_clear(base, UTMI_CTRL, 1<<UTMI_CTRL_PWR_UP_SHIFT); 2108c2ecf20Sopenharmony_ci u2o_clear(base, UTMI_CTRL, 1<<UTMI_CTRL_PLL_PWR_UP_SHIFT); 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci return 0; 2138c2ecf20Sopenharmony_ci} 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ciint pxa_usb_phy_init(void __iomem *phy_reg) 2168c2ecf20Sopenharmony_ci{ 2178c2ecf20Sopenharmony_ci mutex_lock(&phy_lock); 2188c2ecf20Sopenharmony_ci if (phy_init_cnt++ == 0) 2198c2ecf20Sopenharmony_ci usb_phy_init_internal(phy_reg); 2208c2ecf20Sopenharmony_ci mutex_unlock(&phy_lock); 2218c2ecf20Sopenharmony_ci return 0; 2228c2ecf20Sopenharmony_ci} 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_civoid pxa_usb_phy_deinit(void __iomem *phy_reg) 2258c2ecf20Sopenharmony_ci{ 2268c2ecf20Sopenharmony_ci WARN_ON(phy_init_cnt == 0); 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_ci mutex_lock(&phy_lock); 2298c2ecf20Sopenharmony_ci if (--phy_init_cnt == 0) 2308c2ecf20Sopenharmony_ci usb_phy_deinit_internal(phy_reg); 2318c2ecf20Sopenharmony_ci mutex_unlock(&phy_lock); 2328c2ecf20Sopenharmony_ci} 2338c2ecf20Sopenharmony_ci#endif 2348c2ecf20Sopenharmony_ci#endif 2358c2ecf20Sopenharmony_ci#endif 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_USB_SUPPORT) 2388c2ecf20Sopenharmony_cistatic u64 __maybe_unused usb_dma_mask = ~(u32)0; 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_PHY_PXA_USB) 2418c2ecf20Sopenharmony_cistruct resource pxa168_usb_phy_resources[] = { 2428c2ecf20Sopenharmony_ci [0] = { 2438c2ecf20Sopenharmony_ci .start = PXA168_U2O_PHYBASE, 2448c2ecf20Sopenharmony_ci .end = PXA168_U2O_PHYBASE + USB_PHY_RANGE, 2458c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 2468c2ecf20Sopenharmony_ci }, 2478c2ecf20Sopenharmony_ci}; 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_cistruct platform_device pxa168_device_usb_phy = { 2508c2ecf20Sopenharmony_ci .name = "pxa-usb-phy", 2518c2ecf20Sopenharmony_ci .id = -1, 2528c2ecf20Sopenharmony_ci .resource = pxa168_usb_phy_resources, 2538c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(pxa168_usb_phy_resources), 2548c2ecf20Sopenharmony_ci .dev = { 2558c2ecf20Sopenharmony_ci .dma_mask = &usb_dma_mask, 2568c2ecf20Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 2578c2ecf20Sopenharmony_ci } 2588c2ecf20Sopenharmony_ci}; 2598c2ecf20Sopenharmony_ci#endif /* CONFIG_PHY_PXA_USB */ 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_USB_MV_UDC) 2628c2ecf20Sopenharmony_cistruct resource pxa168_u2o_resources[] = { 2638c2ecf20Sopenharmony_ci /* regbase */ 2648c2ecf20Sopenharmony_ci [0] = { 2658c2ecf20Sopenharmony_ci .start = PXA168_U2O_REGBASE + U2x_CAPREGS_OFFSET, 2668c2ecf20Sopenharmony_ci .end = PXA168_U2O_REGBASE + USB_REG_RANGE, 2678c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 2688c2ecf20Sopenharmony_ci .name = "capregs", 2698c2ecf20Sopenharmony_ci }, 2708c2ecf20Sopenharmony_ci /* phybase */ 2718c2ecf20Sopenharmony_ci [1] = { 2728c2ecf20Sopenharmony_ci .start = PXA168_U2O_PHYBASE, 2738c2ecf20Sopenharmony_ci .end = PXA168_U2O_PHYBASE + USB_PHY_RANGE, 2748c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 2758c2ecf20Sopenharmony_ci .name = "phyregs", 2768c2ecf20Sopenharmony_ci }, 2778c2ecf20Sopenharmony_ci [2] = { 2788c2ecf20Sopenharmony_ci .start = IRQ_PXA168_USB1, 2798c2ecf20Sopenharmony_ci .end = IRQ_PXA168_USB1, 2808c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 2818c2ecf20Sopenharmony_ci }, 2828c2ecf20Sopenharmony_ci}; 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_cistruct platform_device pxa168_device_u2o = { 2858c2ecf20Sopenharmony_ci .name = "mv-udc", 2868c2ecf20Sopenharmony_ci .id = -1, 2878c2ecf20Sopenharmony_ci .resource = pxa168_u2o_resources, 2888c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(pxa168_u2o_resources), 2898c2ecf20Sopenharmony_ci .dev = { 2908c2ecf20Sopenharmony_ci .dma_mask = &usb_dma_mask, 2918c2ecf20Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 2928c2ecf20Sopenharmony_ci } 2938c2ecf20Sopenharmony_ci}; 2948c2ecf20Sopenharmony_ci#endif /* CONFIG_USB_MV_UDC */ 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_USB_EHCI_MV_U2O) 2978c2ecf20Sopenharmony_cistruct resource pxa168_u2oehci_resources[] = { 2988c2ecf20Sopenharmony_ci [0] = { 2998c2ecf20Sopenharmony_ci .start = PXA168_U2O_REGBASE, 3008c2ecf20Sopenharmony_ci .end = PXA168_U2O_REGBASE + USB_REG_RANGE, 3018c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 3028c2ecf20Sopenharmony_ci }, 3038c2ecf20Sopenharmony_ci [1] = { 3048c2ecf20Sopenharmony_ci .start = IRQ_PXA168_USB1, 3058c2ecf20Sopenharmony_ci .end = IRQ_PXA168_USB1, 3068c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 3078c2ecf20Sopenharmony_ci }, 3088c2ecf20Sopenharmony_ci}; 3098c2ecf20Sopenharmony_ci 3108c2ecf20Sopenharmony_cistruct platform_device pxa168_device_u2oehci = { 3118c2ecf20Sopenharmony_ci .name = "pxa-u2oehci", 3128c2ecf20Sopenharmony_ci .id = -1, 3138c2ecf20Sopenharmony_ci .dev = { 3148c2ecf20Sopenharmony_ci .dma_mask = &usb_dma_mask, 3158c2ecf20Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 3168c2ecf20Sopenharmony_ci }, 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(pxa168_u2oehci_resources), 3198c2ecf20Sopenharmony_ci .resource = pxa168_u2oehci_resources, 3208c2ecf20Sopenharmony_ci}; 3218c2ecf20Sopenharmony_ci#endif 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_USB_MV_OTG) 3248c2ecf20Sopenharmony_cistruct resource pxa168_u2ootg_resources[] = { 3258c2ecf20Sopenharmony_ci /* regbase */ 3268c2ecf20Sopenharmony_ci [0] = { 3278c2ecf20Sopenharmony_ci .start = PXA168_U2O_REGBASE + U2x_CAPREGS_OFFSET, 3288c2ecf20Sopenharmony_ci .end = PXA168_U2O_REGBASE + USB_REG_RANGE, 3298c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 3308c2ecf20Sopenharmony_ci .name = "capregs", 3318c2ecf20Sopenharmony_ci }, 3328c2ecf20Sopenharmony_ci /* phybase */ 3338c2ecf20Sopenharmony_ci [1] = { 3348c2ecf20Sopenharmony_ci .start = PXA168_U2O_PHYBASE, 3358c2ecf20Sopenharmony_ci .end = PXA168_U2O_PHYBASE + USB_PHY_RANGE, 3368c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 3378c2ecf20Sopenharmony_ci .name = "phyregs", 3388c2ecf20Sopenharmony_ci }, 3398c2ecf20Sopenharmony_ci [2] = { 3408c2ecf20Sopenharmony_ci .start = IRQ_PXA168_USB1, 3418c2ecf20Sopenharmony_ci .end = IRQ_PXA168_USB1, 3428c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 3438c2ecf20Sopenharmony_ci }, 3448c2ecf20Sopenharmony_ci}; 3458c2ecf20Sopenharmony_ci 3468c2ecf20Sopenharmony_cistruct platform_device pxa168_device_u2ootg = { 3478c2ecf20Sopenharmony_ci .name = "mv-otg", 3488c2ecf20Sopenharmony_ci .id = -1, 3498c2ecf20Sopenharmony_ci .dev = { 3508c2ecf20Sopenharmony_ci .dma_mask = &usb_dma_mask, 3518c2ecf20Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 3528c2ecf20Sopenharmony_ci }, 3538c2ecf20Sopenharmony_ci 3548c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(pxa168_u2ootg_resources), 3558c2ecf20Sopenharmony_ci .resource = pxa168_u2ootg_resources, 3568c2ecf20Sopenharmony_ci}; 3578c2ecf20Sopenharmony_ci#endif /* CONFIG_USB_MV_OTG */ 3588c2ecf20Sopenharmony_ci 3598c2ecf20Sopenharmony_ci#endif 360