18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * arch/arm/plat-orion/common.c 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Marvell Orion SoC common setup code used by multiple mach-/common.c 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * This file is licensed under the terms of the GNU General Public 78c2ecf20Sopenharmony_ci * License version 2. This program is licensed "as is" without any 88c2ecf20Sopenharmony_ci * warranty of any kind, whether express or implied. 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/kernel.h> 128c2ecf20Sopenharmony_ci#include <linux/init.h> 138c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 148c2ecf20Sopenharmony_ci#include <linux/dma-mapping.h> 158c2ecf20Sopenharmony_ci#include <linux/serial_8250.h> 168c2ecf20Sopenharmony_ci#include <linux/ata_platform.h> 178c2ecf20Sopenharmony_ci#include <linux/clk.h> 188c2ecf20Sopenharmony_ci#include <linux/clkdev.h> 198c2ecf20Sopenharmony_ci#include <linux/mv643xx_eth.h> 208c2ecf20Sopenharmony_ci#include <linux/mv643xx_i2c.h> 218c2ecf20Sopenharmony_ci#include <linux/platform_data/dsa.h> 228c2ecf20Sopenharmony_ci#include <linux/platform_data/dma-mv_xor.h> 238c2ecf20Sopenharmony_ci#include <linux/platform_data/usb-ehci-orion.h> 248c2ecf20Sopenharmony_ci#include <plat/common.h> 258c2ecf20Sopenharmony_ci#include <linux/phy.h> 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci/* Create a clkdev entry for a given device/clk */ 288c2ecf20Sopenharmony_civoid __init orion_clkdev_add(const char *con_id, const char *dev_id, 298c2ecf20Sopenharmony_ci struct clk *clk) 308c2ecf20Sopenharmony_ci{ 318c2ecf20Sopenharmony_ci clkdev_create(clk, con_id, "%s", dev_id); 328c2ecf20Sopenharmony_ci} 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci/* Create clkdev entries for all orion platforms except kirkwood. 358c2ecf20Sopenharmony_ci Kirkwood has gated clocks for some of its peripherals, so creates 368c2ecf20Sopenharmony_ci its own clkdev entries. For all the other orion devices, create 378c2ecf20Sopenharmony_ci clkdev entries to the tclk. */ 388c2ecf20Sopenharmony_civoid __init orion_clkdev_init(struct clk *tclk) 398c2ecf20Sopenharmony_ci{ 408c2ecf20Sopenharmony_ci orion_clkdev_add(NULL, "orion_spi.0", tclk); 418c2ecf20Sopenharmony_ci orion_clkdev_add(NULL, "orion_spi.1", tclk); 428c2ecf20Sopenharmony_ci orion_clkdev_add(NULL, MV643XX_ETH_NAME ".0", tclk); 438c2ecf20Sopenharmony_ci orion_clkdev_add(NULL, MV643XX_ETH_NAME ".1", tclk); 448c2ecf20Sopenharmony_ci orion_clkdev_add(NULL, MV643XX_ETH_NAME ".2", tclk); 458c2ecf20Sopenharmony_ci orion_clkdev_add(NULL, MV643XX_ETH_NAME ".3", tclk); 468c2ecf20Sopenharmony_ci orion_clkdev_add(NULL, "orion_wdt", tclk); 478c2ecf20Sopenharmony_ci orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".0", tclk); 488c2ecf20Sopenharmony_ci} 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci/* Fill in the resources structure and link it into the platform 518c2ecf20Sopenharmony_ci device structure. There is always a memory region, and nearly 528c2ecf20Sopenharmony_ci always an interrupt.*/ 538c2ecf20Sopenharmony_cistatic void fill_resources(struct platform_device *device, 548c2ecf20Sopenharmony_ci struct resource *resources, 558c2ecf20Sopenharmony_ci resource_size_t mapbase, 568c2ecf20Sopenharmony_ci resource_size_t size) 578c2ecf20Sopenharmony_ci{ 588c2ecf20Sopenharmony_ci device->resource = resources; 598c2ecf20Sopenharmony_ci device->num_resources = 1; 608c2ecf20Sopenharmony_ci resources[0].flags = IORESOURCE_MEM; 618c2ecf20Sopenharmony_ci resources[0].start = mapbase; 628c2ecf20Sopenharmony_ci resources[0].end = mapbase + size; 638c2ecf20Sopenharmony_ci} 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_cistatic void fill_resources_irq(struct platform_device *device, 668c2ecf20Sopenharmony_ci struct resource *resources, 678c2ecf20Sopenharmony_ci resource_size_t mapbase, 688c2ecf20Sopenharmony_ci resource_size_t size, 698c2ecf20Sopenharmony_ci unsigned int irq) 708c2ecf20Sopenharmony_ci{ 718c2ecf20Sopenharmony_ci fill_resources(device, resources, mapbase, size); 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci device->num_resources++; 748c2ecf20Sopenharmony_ci resources[1].flags = IORESOURCE_IRQ; 758c2ecf20Sopenharmony_ci resources[1].start = irq; 768c2ecf20Sopenharmony_ci resources[1].end = irq; 778c2ecf20Sopenharmony_ci} 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci/***************************************************************************** 808c2ecf20Sopenharmony_ci * UART 818c2ecf20Sopenharmony_ci ****************************************************************************/ 828c2ecf20Sopenharmony_cistatic unsigned long __init uart_get_clk_rate(struct clk *clk) 838c2ecf20Sopenharmony_ci{ 848c2ecf20Sopenharmony_ci clk_prepare_enable(clk); 858c2ecf20Sopenharmony_ci return clk_get_rate(clk); 868c2ecf20Sopenharmony_ci} 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_cistatic void __init uart_complete( 898c2ecf20Sopenharmony_ci struct platform_device *orion_uart, 908c2ecf20Sopenharmony_ci struct plat_serial8250_port *data, 918c2ecf20Sopenharmony_ci struct resource *resources, 928c2ecf20Sopenharmony_ci void __iomem *membase, 938c2ecf20Sopenharmony_ci resource_size_t mapbase, 948c2ecf20Sopenharmony_ci unsigned int irq, 958c2ecf20Sopenharmony_ci struct clk *clk) 968c2ecf20Sopenharmony_ci{ 978c2ecf20Sopenharmony_ci data->mapbase = mapbase; 988c2ecf20Sopenharmony_ci data->membase = membase; 998c2ecf20Sopenharmony_ci data->irq = irq; 1008c2ecf20Sopenharmony_ci data->uartclk = uart_get_clk_rate(clk); 1018c2ecf20Sopenharmony_ci orion_uart->dev.platform_data = data; 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci fill_resources_irq(orion_uart, resources, mapbase, 0xff, irq); 1048c2ecf20Sopenharmony_ci platform_device_register(orion_uart); 1058c2ecf20Sopenharmony_ci} 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci/***************************************************************************** 1088c2ecf20Sopenharmony_ci * UART0 1098c2ecf20Sopenharmony_ci ****************************************************************************/ 1108c2ecf20Sopenharmony_cistatic struct plat_serial8250_port orion_uart0_data[] = { 1118c2ecf20Sopenharmony_ci { 1128c2ecf20Sopenharmony_ci .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, 1138c2ecf20Sopenharmony_ci .iotype = UPIO_MEM, 1148c2ecf20Sopenharmony_ci .regshift = 2, 1158c2ecf20Sopenharmony_ci }, { 1168c2ecf20Sopenharmony_ci }, 1178c2ecf20Sopenharmony_ci}; 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_cistatic struct resource orion_uart0_resources[2]; 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_cistatic struct platform_device orion_uart0 = { 1228c2ecf20Sopenharmony_ci .name = "serial8250", 1238c2ecf20Sopenharmony_ci .id = PLAT8250_DEV_PLATFORM, 1248c2ecf20Sopenharmony_ci}; 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_civoid __init orion_uart0_init(void __iomem *membase, 1278c2ecf20Sopenharmony_ci resource_size_t mapbase, 1288c2ecf20Sopenharmony_ci unsigned int irq, 1298c2ecf20Sopenharmony_ci struct clk *clk) 1308c2ecf20Sopenharmony_ci{ 1318c2ecf20Sopenharmony_ci uart_complete(&orion_uart0, orion_uart0_data, orion_uart0_resources, 1328c2ecf20Sopenharmony_ci membase, mapbase, irq, clk); 1338c2ecf20Sopenharmony_ci} 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci/***************************************************************************** 1368c2ecf20Sopenharmony_ci * UART1 1378c2ecf20Sopenharmony_ci ****************************************************************************/ 1388c2ecf20Sopenharmony_cistatic struct plat_serial8250_port orion_uart1_data[] = { 1398c2ecf20Sopenharmony_ci { 1408c2ecf20Sopenharmony_ci .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, 1418c2ecf20Sopenharmony_ci .iotype = UPIO_MEM, 1428c2ecf20Sopenharmony_ci .regshift = 2, 1438c2ecf20Sopenharmony_ci }, { 1448c2ecf20Sopenharmony_ci }, 1458c2ecf20Sopenharmony_ci}; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_cistatic struct resource orion_uart1_resources[2]; 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_cistatic struct platform_device orion_uart1 = { 1508c2ecf20Sopenharmony_ci .name = "serial8250", 1518c2ecf20Sopenharmony_ci .id = PLAT8250_DEV_PLATFORM1, 1528c2ecf20Sopenharmony_ci}; 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_civoid __init orion_uart1_init(void __iomem *membase, 1558c2ecf20Sopenharmony_ci resource_size_t mapbase, 1568c2ecf20Sopenharmony_ci unsigned int irq, 1578c2ecf20Sopenharmony_ci struct clk *clk) 1588c2ecf20Sopenharmony_ci{ 1598c2ecf20Sopenharmony_ci uart_complete(&orion_uart1, orion_uart1_data, orion_uart1_resources, 1608c2ecf20Sopenharmony_ci membase, mapbase, irq, clk); 1618c2ecf20Sopenharmony_ci} 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci/***************************************************************************** 1648c2ecf20Sopenharmony_ci * UART2 1658c2ecf20Sopenharmony_ci ****************************************************************************/ 1668c2ecf20Sopenharmony_cistatic struct plat_serial8250_port orion_uart2_data[] = { 1678c2ecf20Sopenharmony_ci { 1688c2ecf20Sopenharmony_ci .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, 1698c2ecf20Sopenharmony_ci .iotype = UPIO_MEM, 1708c2ecf20Sopenharmony_ci .regshift = 2, 1718c2ecf20Sopenharmony_ci }, { 1728c2ecf20Sopenharmony_ci }, 1738c2ecf20Sopenharmony_ci}; 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_cistatic struct resource orion_uart2_resources[2]; 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_cistatic struct platform_device orion_uart2 = { 1788c2ecf20Sopenharmony_ci .name = "serial8250", 1798c2ecf20Sopenharmony_ci .id = PLAT8250_DEV_PLATFORM2, 1808c2ecf20Sopenharmony_ci}; 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_civoid __init orion_uart2_init(void __iomem *membase, 1838c2ecf20Sopenharmony_ci resource_size_t mapbase, 1848c2ecf20Sopenharmony_ci unsigned int irq, 1858c2ecf20Sopenharmony_ci struct clk *clk) 1868c2ecf20Sopenharmony_ci{ 1878c2ecf20Sopenharmony_ci uart_complete(&orion_uart2, orion_uart2_data, orion_uart2_resources, 1888c2ecf20Sopenharmony_ci membase, mapbase, irq, clk); 1898c2ecf20Sopenharmony_ci} 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci/***************************************************************************** 1928c2ecf20Sopenharmony_ci * UART3 1938c2ecf20Sopenharmony_ci ****************************************************************************/ 1948c2ecf20Sopenharmony_cistatic struct plat_serial8250_port orion_uart3_data[] = { 1958c2ecf20Sopenharmony_ci { 1968c2ecf20Sopenharmony_ci .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, 1978c2ecf20Sopenharmony_ci .iotype = UPIO_MEM, 1988c2ecf20Sopenharmony_ci .regshift = 2, 1998c2ecf20Sopenharmony_ci }, { 2008c2ecf20Sopenharmony_ci }, 2018c2ecf20Sopenharmony_ci}; 2028c2ecf20Sopenharmony_ci 2038c2ecf20Sopenharmony_cistatic struct resource orion_uart3_resources[2]; 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_cistatic struct platform_device orion_uart3 = { 2068c2ecf20Sopenharmony_ci .name = "serial8250", 2078c2ecf20Sopenharmony_ci .id = 3, 2088c2ecf20Sopenharmony_ci}; 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_civoid __init orion_uart3_init(void __iomem *membase, 2118c2ecf20Sopenharmony_ci resource_size_t mapbase, 2128c2ecf20Sopenharmony_ci unsigned int irq, 2138c2ecf20Sopenharmony_ci struct clk *clk) 2148c2ecf20Sopenharmony_ci{ 2158c2ecf20Sopenharmony_ci uart_complete(&orion_uart3, orion_uart3_data, orion_uart3_resources, 2168c2ecf20Sopenharmony_ci membase, mapbase, irq, clk); 2178c2ecf20Sopenharmony_ci} 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_ci/***************************************************************************** 2208c2ecf20Sopenharmony_ci * SoC RTC 2218c2ecf20Sopenharmony_ci ****************************************************************************/ 2228c2ecf20Sopenharmony_cistatic struct resource orion_rtc_resource[2]; 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_civoid __init orion_rtc_init(unsigned long mapbase, 2258c2ecf20Sopenharmony_ci unsigned long irq) 2268c2ecf20Sopenharmony_ci{ 2278c2ecf20Sopenharmony_ci orion_rtc_resource[0].start = mapbase; 2288c2ecf20Sopenharmony_ci orion_rtc_resource[0].end = mapbase + SZ_32 - 1; 2298c2ecf20Sopenharmony_ci orion_rtc_resource[0].flags = IORESOURCE_MEM; 2308c2ecf20Sopenharmony_ci orion_rtc_resource[1].start = irq; 2318c2ecf20Sopenharmony_ci orion_rtc_resource[1].end = irq; 2328c2ecf20Sopenharmony_ci orion_rtc_resource[1].flags = IORESOURCE_IRQ; 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ci platform_device_register_simple("rtc-mv", -1, orion_rtc_resource, 2); 2358c2ecf20Sopenharmony_ci} 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci/***************************************************************************** 2388c2ecf20Sopenharmony_ci * GE 2398c2ecf20Sopenharmony_ci ****************************************************************************/ 2408c2ecf20Sopenharmony_cistatic __init void ge_complete( 2418c2ecf20Sopenharmony_ci struct mv643xx_eth_shared_platform_data *orion_ge_shared_data, 2428c2ecf20Sopenharmony_ci struct resource *orion_ge_resource, unsigned long irq, 2438c2ecf20Sopenharmony_ci struct platform_device *orion_ge_shared, 2448c2ecf20Sopenharmony_ci struct platform_device *orion_ge_mvmdio, 2458c2ecf20Sopenharmony_ci struct mv643xx_eth_platform_data *eth_data, 2468c2ecf20Sopenharmony_ci struct platform_device *orion_ge) 2478c2ecf20Sopenharmony_ci{ 2488c2ecf20Sopenharmony_ci orion_ge_resource->start = irq; 2498c2ecf20Sopenharmony_ci orion_ge_resource->end = irq; 2508c2ecf20Sopenharmony_ci eth_data->shared = orion_ge_shared; 2518c2ecf20Sopenharmony_ci orion_ge->dev.platform_data = eth_data; 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci platform_device_register(orion_ge_shared); 2548c2ecf20Sopenharmony_ci if (orion_ge_mvmdio) 2558c2ecf20Sopenharmony_ci platform_device_register(orion_ge_mvmdio); 2568c2ecf20Sopenharmony_ci platform_device_register(orion_ge); 2578c2ecf20Sopenharmony_ci} 2588c2ecf20Sopenharmony_ci 2598c2ecf20Sopenharmony_ci/***************************************************************************** 2608c2ecf20Sopenharmony_ci * GE00 2618c2ecf20Sopenharmony_ci ****************************************************************************/ 2628c2ecf20Sopenharmony_cistatic struct mv643xx_eth_shared_platform_data orion_ge00_shared_data; 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_cistatic struct resource orion_ge00_shared_resources[] = { 2658c2ecf20Sopenharmony_ci { 2668c2ecf20Sopenharmony_ci .name = "ge00 base", 2678c2ecf20Sopenharmony_ci }, 2688c2ecf20Sopenharmony_ci}; 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_cistatic struct platform_device orion_ge00_shared = { 2718c2ecf20Sopenharmony_ci .name = MV643XX_ETH_SHARED_NAME, 2728c2ecf20Sopenharmony_ci .id = 0, 2738c2ecf20Sopenharmony_ci .dev = { 2748c2ecf20Sopenharmony_ci .platform_data = &orion_ge00_shared_data, 2758c2ecf20Sopenharmony_ci }, 2768c2ecf20Sopenharmony_ci}; 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_cistatic struct resource orion_ge_mvmdio_resources[] = { 2798c2ecf20Sopenharmony_ci { 2808c2ecf20Sopenharmony_ci .name = "ge00 mvmdio base", 2818c2ecf20Sopenharmony_ci }, { 2828c2ecf20Sopenharmony_ci .name = "ge00 mvmdio err irq", 2838c2ecf20Sopenharmony_ci }, 2848c2ecf20Sopenharmony_ci}; 2858c2ecf20Sopenharmony_ci 2868c2ecf20Sopenharmony_cistatic struct platform_device orion_ge_mvmdio = { 2878c2ecf20Sopenharmony_ci .name = "orion-mdio", 2888c2ecf20Sopenharmony_ci .id = -1, 2898c2ecf20Sopenharmony_ci}; 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_cistatic struct resource orion_ge00_resources[] = { 2928c2ecf20Sopenharmony_ci { 2938c2ecf20Sopenharmony_ci .name = "ge00 irq", 2948c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 2958c2ecf20Sopenharmony_ci }, 2968c2ecf20Sopenharmony_ci}; 2978c2ecf20Sopenharmony_ci 2988c2ecf20Sopenharmony_cistatic struct platform_device orion_ge00 = { 2998c2ecf20Sopenharmony_ci .name = MV643XX_ETH_NAME, 3008c2ecf20Sopenharmony_ci .id = 0, 3018c2ecf20Sopenharmony_ci .num_resources = 1, 3028c2ecf20Sopenharmony_ci .resource = orion_ge00_resources, 3038c2ecf20Sopenharmony_ci .dev = { 3048c2ecf20Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 3058c2ecf20Sopenharmony_ci }, 3068c2ecf20Sopenharmony_ci}; 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_civoid __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data, 3098c2ecf20Sopenharmony_ci unsigned long mapbase, 3108c2ecf20Sopenharmony_ci unsigned long irq, 3118c2ecf20Sopenharmony_ci unsigned long irq_err, 3128c2ecf20Sopenharmony_ci unsigned int tx_csum_limit) 3138c2ecf20Sopenharmony_ci{ 3148c2ecf20Sopenharmony_ci fill_resources(&orion_ge00_shared, orion_ge00_shared_resources, 3158c2ecf20Sopenharmony_ci mapbase + 0x2000, SZ_16K - 1); 3168c2ecf20Sopenharmony_ci fill_resources_irq(&orion_ge_mvmdio, orion_ge_mvmdio_resources, 3178c2ecf20Sopenharmony_ci mapbase + 0x2004, 0x84 - 1, irq_err); 3188c2ecf20Sopenharmony_ci orion_ge00_shared_data.tx_csum_limit = tx_csum_limit; 3198c2ecf20Sopenharmony_ci ge_complete(&orion_ge00_shared_data, 3208c2ecf20Sopenharmony_ci orion_ge00_resources, irq, &orion_ge00_shared, 3218c2ecf20Sopenharmony_ci &orion_ge_mvmdio, 3228c2ecf20Sopenharmony_ci eth_data, &orion_ge00); 3238c2ecf20Sopenharmony_ci} 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_ci/***************************************************************************** 3268c2ecf20Sopenharmony_ci * GE01 3278c2ecf20Sopenharmony_ci ****************************************************************************/ 3288c2ecf20Sopenharmony_cistatic struct mv643xx_eth_shared_platform_data orion_ge01_shared_data; 3298c2ecf20Sopenharmony_ci 3308c2ecf20Sopenharmony_cistatic struct resource orion_ge01_shared_resources[] = { 3318c2ecf20Sopenharmony_ci { 3328c2ecf20Sopenharmony_ci .name = "ge01 base", 3338c2ecf20Sopenharmony_ci } 3348c2ecf20Sopenharmony_ci}; 3358c2ecf20Sopenharmony_ci 3368c2ecf20Sopenharmony_cistatic struct platform_device orion_ge01_shared = { 3378c2ecf20Sopenharmony_ci .name = MV643XX_ETH_SHARED_NAME, 3388c2ecf20Sopenharmony_ci .id = 1, 3398c2ecf20Sopenharmony_ci .dev = { 3408c2ecf20Sopenharmony_ci .platform_data = &orion_ge01_shared_data, 3418c2ecf20Sopenharmony_ci }, 3428c2ecf20Sopenharmony_ci}; 3438c2ecf20Sopenharmony_ci 3448c2ecf20Sopenharmony_cistatic struct resource orion_ge01_resources[] = { 3458c2ecf20Sopenharmony_ci { 3468c2ecf20Sopenharmony_ci .name = "ge01 irq", 3478c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 3488c2ecf20Sopenharmony_ci }, 3498c2ecf20Sopenharmony_ci}; 3508c2ecf20Sopenharmony_ci 3518c2ecf20Sopenharmony_cistatic struct platform_device orion_ge01 = { 3528c2ecf20Sopenharmony_ci .name = MV643XX_ETH_NAME, 3538c2ecf20Sopenharmony_ci .id = 1, 3548c2ecf20Sopenharmony_ci .num_resources = 1, 3558c2ecf20Sopenharmony_ci .resource = orion_ge01_resources, 3568c2ecf20Sopenharmony_ci .dev = { 3578c2ecf20Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 3588c2ecf20Sopenharmony_ci }, 3598c2ecf20Sopenharmony_ci}; 3608c2ecf20Sopenharmony_ci 3618c2ecf20Sopenharmony_civoid __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data, 3628c2ecf20Sopenharmony_ci unsigned long mapbase, 3638c2ecf20Sopenharmony_ci unsigned long irq, 3648c2ecf20Sopenharmony_ci unsigned int tx_csum_limit) 3658c2ecf20Sopenharmony_ci{ 3668c2ecf20Sopenharmony_ci fill_resources(&orion_ge01_shared, orion_ge01_shared_resources, 3678c2ecf20Sopenharmony_ci mapbase + 0x2000, SZ_16K - 1); 3688c2ecf20Sopenharmony_ci orion_ge01_shared_data.tx_csum_limit = tx_csum_limit; 3698c2ecf20Sopenharmony_ci ge_complete(&orion_ge01_shared_data, 3708c2ecf20Sopenharmony_ci orion_ge01_resources, irq, &orion_ge01_shared, 3718c2ecf20Sopenharmony_ci NULL, 3728c2ecf20Sopenharmony_ci eth_data, &orion_ge01); 3738c2ecf20Sopenharmony_ci} 3748c2ecf20Sopenharmony_ci 3758c2ecf20Sopenharmony_ci/***************************************************************************** 3768c2ecf20Sopenharmony_ci * GE10 3778c2ecf20Sopenharmony_ci ****************************************************************************/ 3788c2ecf20Sopenharmony_cistatic struct mv643xx_eth_shared_platform_data orion_ge10_shared_data; 3798c2ecf20Sopenharmony_ci 3808c2ecf20Sopenharmony_cistatic struct resource orion_ge10_shared_resources[] = { 3818c2ecf20Sopenharmony_ci { 3828c2ecf20Sopenharmony_ci .name = "ge10 base", 3838c2ecf20Sopenharmony_ci } 3848c2ecf20Sopenharmony_ci}; 3858c2ecf20Sopenharmony_ci 3868c2ecf20Sopenharmony_cistatic struct platform_device orion_ge10_shared = { 3878c2ecf20Sopenharmony_ci .name = MV643XX_ETH_SHARED_NAME, 3888c2ecf20Sopenharmony_ci .id = 2, 3898c2ecf20Sopenharmony_ci .dev = { 3908c2ecf20Sopenharmony_ci .platform_data = &orion_ge10_shared_data, 3918c2ecf20Sopenharmony_ci }, 3928c2ecf20Sopenharmony_ci}; 3938c2ecf20Sopenharmony_ci 3948c2ecf20Sopenharmony_cistatic struct resource orion_ge10_resources[] = { 3958c2ecf20Sopenharmony_ci { 3968c2ecf20Sopenharmony_ci .name = "ge10 irq", 3978c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 3988c2ecf20Sopenharmony_ci }, 3998c2ecf20Sopenharmony_ci}; 4008c2ecf20Sopenharmony_ci 4018c2ecf20Sopenharmony_cistatic struct platform_device orion_ge10 = { 4028c2ecf20Sopenharmony_ci .name = MV643XX_ETH_NAME, 4038c2ecf20Sopenharmony_ci .id = 2, 4048c2ecf20Sopenharmony_ci .num_resources = 1, 4058c2ecf20Sopenharmony_ci .resource = orion_ge10_resources, 4068c2ecf20Sopenharmony_ci .dev = { 4078c2ecf20Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 4088c2ecf20Sopenharmony_ci }, 4098c2ecf20Sopenharmony_ci}; 4108c2ecf20Sopenharmony_ci 4118c2ecf20Sopenharmony_civoid __init orion_ge10_init(struct mv643xx_eth_platform_data *eth_data, 4128c2ecf20Sopenharmony_ci unsigned long mapbase, 4138c2ecf20Sopenharmony_ci unsigned long irq) 4148c2ecf20Sopenharmony_ci{ 4158c2ecf20Sopenharmony_ci fill_resources(&orion_ge10_shared, orion_ge10_shared_resources, 4168c2ecf20Sopenharmony_ci mapbase + 0x2000, SZ_16K - 1); 4178c2ecf20Sopenharmony_ci ge_complete(&orion_ge10_shared_data, 4188c2ecf20Sopenharmony_ci orion_ge10_resources, irq, &orion_ge10_shared, 4198c2ecf20Sopenharmony_ci NULL, 4208c2ecf20Sopenharmony_ci eth_data, &orion_ge10); 4218c2ecf20Sopenharmony_ci} 4228c2ecf20Sopenharmony_ci 4238c2ecf20Sopenharmony_ci/***************************************************************************** 4248c2ecf20Sopenharmony_ci * GE11 4258c2ecf20Sopenharmony_ci ****************************************************************************/ 4268c2ecf20Sopenharmony_cistatic struct mv643xx_eth_shared_platform_data orion_ge11_shared_data; 4278c2ecf20Sopenharmony_ci 4288c2ecf20Sopenharmony_cistatic struct resource orion_ge11_shared_resources[] = { 4298c2ecf20Sopenharmony_ci { 4308c2ecf20Sopenharmony_ci .name = "ge11 base", 4318c2ecf20Sopenharmony_ci }, 4328c2ecf20Sopenharmony_ci}; 4338c2ecf20Sopenharmony_ci 4348c2ecf20Sopenharmony_cistatic struct platform_device orion_ge11_shared = { 4358c2ecf20Sopenharmony_ci .name = MV643XX_ETH_SHARED_NAME, 4368c2ecf20Sopenharmony_ci .id = 3, 4378c2ecf20Sopenharmony_ci .dev = { 4388c2ecf20Sopenharmony_ci .platform_data = &orion_ge11_shared_data, 4398c2ecf20Sopenharmony_ci }, 4408c2ecf20Sopenharmony_ci}; 4418c2ecf20Sopenharmony_ci 4428c2ecf20Sopenharmony_cistatic struct resource orion_ge11_resources[] = { 4438c2ecf20Sopenharmony_ci { 4448c2ecf20Sopenharmony_ci .name = "ge11 irq", 4458c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 4468c2ecf20Sopenharmony_ci }, 4478c2ecf20Sopenharmony_ci}; 4488c2ecf20Sopenharmony_ci 4498c2ecf20Sopenharmony_cistatic struct platform_device orion_ge11 = { 4508c2ecf20Sopenharmony_ci .name = MV643XX_ETH_NAME, 4518c2ecf20Sopenharmony_ci .id = 3, 4528c2ecf20Sopenharmony_ci .num_resources = 1, 4538c2ecf20Sopenharmony_ci .resource = orion_ge11_resources, 4548c2ecf20Sopenharmony_ci .dev = { 4558c2ecf20Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 4568c2ecf20Sopenharmony_ci }, 4578c2ecf20Sopenharmony_ci}; 4588c2ecf20Sopenharmony_ci 4598c2ecf20Sopenharmony_civoid __init orion_ge11_init(struct mv643xx_eth_platform_data *eth_data, 4608c2ecf20Sopenharmony_ci unsigned long mapbase, 4618c2ecf20Sopenharmony_ci unsigned long irq) 4628c2ecf20Sopenharmony_ci{ 4638c2ecf20Sopenharmony_ci fill_resources(&orion_ge11_shared, orion_ge11_shared_resources, 4648c2ecf20Sopenharmony_ci mapbase + 0x2000, SZ_16K - 1); 4658c2ecf20Sopenharmony_ci ge_complete(&orion_ge11_shared_data, 4668c2ecf20Sopenharmony_ci orion_ge11_resources, irq, &orion_ge11_shared, 4678c2ecf20Sopenharmony_ci NULL, 4688c2ecf20Sopenharmony_ci eth_data, &orion_ge11); 4698c2ecf20Sopenharmony_ci} 4708c2ecf20Sopenharmony_ci 4718c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_ORION5X 4728c2ecf20Sopenharmony_ci/***************************************************************************** 4738c2ecf20Sopenharmony_ci * Ethernet switch 4748c2ecf20Sopenharmony_ci ****************************************************************************/ 4758c2ecf20Sopenharmony_cistatic __initdata struct mdio_board_info orion_ge00_switch_board_info = { 4768c2ecf20Sopenharmony_ci .bus_id = "orion-mii", 4778c2ecf20Sopenharmony_ci .modalias = "mv88e6085", 4788c2ecf20Sopenharmony_ci}; 4798c2ecf20Sopenharmony_ci 4808c2ecf20Sopenharmony_civoid __init orion_ge00_switch_init(struct dsa_chip_data *d) 4818c2ecf20Sopenharmony_ci{ 4828c2ecf20Sopenharmony_ci unsigned int i; 4838c2ecf20Sopenharmony_ci 4848c2ecf20Sopenharmony_ci if (!IS_BUILTIN(CONFIG_PHYLIB)) 4858c2ecf20Sopenharmony_ci return; 4868c2ecf20Sopenharmony_ci 4878c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(d->port_names); i++) { 4888c2ecf20Sopenharmony_ci if (!strcmp(d->port_names[i], "cpu")) { 4898c2ecf20Sopenharmony_ci d->netdev[i] = &orion_ge00.dev; 4908c2ecf20Sopenharmony_ci break; 4918c2ecf20Sopenharmony_ci } 4928c2ecf20Sopenharmony_ci } 4938c2ecf20Sopenharmony_ci 4948c2ecf20Sopenharmony_ci orion_ge00_switch_board_info.mdio_addr = d->sw_addr; 4958c2ecf20Sopenharmony_ci orion_ge00_switch_board_info.platform_data = d; 4968c2ecf20Sopenharmony_ci 4978c2ecf20Sopenharmony_ci mdiobus_register_board_info(&orion_ge00_switch_board_info, 1); 4988c2ecf20Sopenharmony_ci} 4998c2ecf20Sopenharmony_ci#endif 5008c2ecf20Sopenharmony_ci 5018c2ecf20Sopenharmony_ci/***************************************************************************** 5028c2ecf20Sopenharmony_ci * I2C 5038c2ecf20Sopenharmony_ci ****************************************************************************/ 5048c2ecf20Sopenharmony_cistatic struct mv64xxx_i2c_pdata orion_i2c_pdata = { 5058c2ecf20Sopenharmony_ci .freq_n = 3, 5068c2ecf20Sopenharmony_ci .timeout = 1000, /* Default timeout of 1 second */ 5078c2ecf20Sopenharmony_ci}; 5088c2ecf20Sopenharmony_ci 5098c2ecf20Sopenharmony_cistatic struct resource orion_i2c_resources[2]; 5108c2ecf20Sopenharmony_ci 5118c2ecf20Sopenharmony_cistatic struct platform_device orion_i2c = { 5128c2ecf20Sopenharmony_ci .name = MV64XXX_I2C_CTLR_NAME, 5138c2ecf20Sopenharmony_ci .id = 0, 5148c2ecf20Sopenharmony_ci .dev = { 5158c2ecf20Sopenharmony_ci .platform_data = &orion_i2c_pdata, 5168c2ecf20Sopenharmony_ci }, 5178c2ecf20Sopenharmony_ci}; 5188c2ecf20Sopenharmony_ci 5198c2ecf20Sopenharmony_cistatic struct mv64xxx_i2c_pdata orion_i2c_1_pdata = { 5208c2ecf20Sopenharmony_ci .freq_n = 3, 5218c2ecf20Sopenharmony_ci .timeout = 1000, /* Default timeout of 1 second */ 5228c2ecf20Sopenharmony_ci}; 5238c2ecf20Sopenharmony_ci 5248c2ecf20Sopenharmony_cistatic struct resource orion_i2c_1_resources[2]; 5258c2ecf20Sopenharmony_ci 5268c2ecf20Sopenharmony_cistatic struct platform_device orion_i2c_1 = { 5278c2ecf20Sopenharmony_ci .name = MV64XXX_I2C_CTLR_NAME, 5288c2ecf20Sopenharmony_ci .id = 1, 5298c2ecf20Sopenharmony_ci .dev = { 5308c2ecf20Sopenharmony_ci .platform_data = &orion_i2c_1_pdata, 5318c2ecf20Sopenharmony_ci }, 5328c2ecf20Sopenharmony_ci}; 5338c2ecf20Sopenharmony_ci 5348c2ecf20Sopenharmony_civoid __init orion_i2c_init(unsigned long mapbase, 5358c2ecf20Sopenharmony_ci unsigned long irq, 5368c2ecf20Sopenharmony_ci unsigned long freq_m) 5378c2ecf20Sopenharmony_ci{ 5388c2ecf20Sopenharmony_ci orion_i2c_pdata.freq_m = freq_m; 5398c2ecf20Sopenharmony_ci fill_resources_irq(&orion_i2c, orion_i2c_resources, mapbase, 5408c2ecf20Sopenharmony_ci SZ_32 - 1, irq); 5418c2ecf20Sopenharmony_ci platform_device_register(&orion_i2c); 5428c2ecf20Sopenharmony_ci} 5438c2ecf20Sopenharmony_ci 5448c2ecf20Sopenharmony_civoid __init orion_i2c_1_init(unsigned long mapbase, 5458c2ecf20Sopenharmony_ci unsigned long irq, 5468c2ecf20Sopenharmony_ci unsigned long freq_m) 5478c2ecf20Sopenharmony_ci{ 5488c2ecf20Sopenharmony_ci orion_i2c_1_pdata.freq_m = freq_m; 5498c2ecf20Sopenharmony_ci fill_resources_irq(&orion_i2c_1, orion_i2c_1_resources, mapbase, 5508c2ecf20Sopenharmony_ci SZ_32 - 1, irq); 5518c2ecf20Sopenharmony_ci platform_device_register(&orion_i2c_1); 5528c2ecf20Sopenharmony_ci} 5538c2ecf20Sopenharmony_ci 5548c2ecf20Sopenharmony_ci/***************************************************************************** 5558c2ecf20Sopenharmony_ci * SPI 5568c2ecf20Sopenharmony_ci ****************************************************************************/ 5578c2ecf20Sopenharmony_cistatic struct resource orion_spi_resources; 5588c2ecf20Sopenharmony_ci 5598c2ecf20Sopenharmony_cistatic struct platform_device orion_spi = { 5608c2ecf20Sopenharmony_ci .name = "orion_spi", 5618c2ecf20Sopenharmony_ci .id = 0, 5628c2ecf20Sopenharmony_ci}; 5638c2ecf20Sopenharmony_ci 5648c2ecf20Sopenharmony_cistatic struct resource orion_spi_1_resources; 5658c2ecf20Sopenharmony_ci 5668c2ecf20Sopenharmony_cistatic struct platform_device orion_spi_1 = { 5678c2ecf20Sopenharmony_ci .name = "orion_spi", 5688c2ecf20Sopenharmony_ci .id = 1, 5698c2ecf20Sopenharmony_ci}; 5708c2ecf20Sopenharmony_ci 5718c2ecf20Sopenharmony_ci/* Note: The SPI silicon core does have interrupts. However the 5728c2ecf20Sopenharmony_ci * current Linux software driver does not use interrupts. */ 5738c2ecf20Sopenharmony_ci 5748c2ecf20Sopenharmony_civoid __init orion_spi_init(unsigned long mapbase) 5758c2ecf20Sopenharmony_ci{ 5768c2ecf20Sopenharmony_ci fill_resources(&orion_spi, &orion_spi_resources, 5778c2ecf20Sopenharmony_ci mapbase, SZ_512 - 1); 5788c2ecf20Sopenharmony_ci platform_device_register(&orion_spi); 5798c2ecf20Sopenharmony_ci} 5808c2ecf20Sopenharmony_ci 5818c2ecf20Sopenharmony_civoid __init orion_spi_1_init(unsigned long mapbase) 5828c2ecf20Sopenharmony_ci{ 5838c2ecf20Sopenharmony_ci fill_resources(&orion_spi_1, &orion_spi_1_resources, 5848c2ecf20Sopenharmony_ci mapbase, SZ_512 - 1); 5858c2ecf20Sopenharmony_ci platform_device_register(&orion_spi_1); 5868c2ecf20Sopenharmony_ci} 5878c2ecf20Sopenharmony_ci 5888c2ecf20Sopenharmony_ci/***************************************************************************** 5898c2ecf20Sopenharmony_ci * XOR 5908c2ecf20Sopenharmony_ci ****************************************************************************/ 5918c2ecf20Sopenharmony_cistatic u64 orion_xor_dmamask = DMA_BIT_MASK(32); 5928c2ecf20Sopenharmony_ci 5938c2ecf20Sopenharmony_ci/***************************************************************************** 5948c2ecf20Sopenharmony_ci * XOR0 5958c2ecf20Sopenharmony_ci ****************************************************************************/ 5968c2ecf20Sopenharmony_cistatic struct resource orion_xor0_shared_resources[] = { 5978c2ecf20Sopenharmony_ci { 5988c2ecf20Sopenharmony_ci .name = "xor 0 low", 5998c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 6008c2ecf20Sopenharmony_ci }, { 6018c2ecf20Sopenharmony_ci .name = "xor 0 high", 6028c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 6038c2ecf20Sopenharmony_ci }, { 6048c2ecf20Sopenharmony_ci .name = "irq channel 0", 6058c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 6068c2ecf20Sopenharmony_ci }, { 6078c2ecf20Sopenharmony_ci .name = "irq channel 1", 6088c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 6098c2ecf20Sopenharmony_ci }, 6108c2ecf20Sopenharmony_ci}; 6118c2ecf20Sopenharmony_ci 6128c2ecf20Sopenharmony_cistatic struct mv_xor_channel_data orion_xor0_channels_data[2]; 6138c2ecf20Sopenharmony_ci 6148c2ecf20Sopenharmony_cistatic struct mv_xor_platform_data orion_xor0_pdata = { 6158c2ecf20Sopenharmony_ci .channels = orion_xor0_channels_data, 6168c2ecf20Sopenharmony_ci}; 6178c2ecf20Sopenharmony_ci 6188c2ecf20Sopenharmony_cistatic struct platform_device orion_xor0_shared = { 6198c2ecf20Sopenharmony_ci .name = MV_XOR_NAME, 6208c2ecf20Sopenharmony_ci .id = 0, 6218c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(orion_xor0_shared_resources), 6228c2ecf20Sopenharmony_ci .resource = orion_xor0_shared_resources, 6238c2ecf20Sopenharmony_ci .dev = { 6248c2ecf20Sopenharmony_ci .dma_mask = &orion_xor_dmamask, 6258c2ecf20Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 6268c2ecf20Sopenharmony_ci .platform_data = &orion_xor0_pdata, 6278c2ecf20Sopenharmony_ci }, 6288c2ecf20Sopenharmony_ci}; 6298c2ecf20Sopenharmony_ci 6308c2ecf20Sopenharmony_civoid __init orion_xor0_init(unsigned long mapbase_low, 6318c2ecf20Sopenharmony_ci unsigned long mapbase_high, 6328c2ecf20Sopenharmony_ci unsigned long irq_0, 6338c2ecf20Sopenharmony_ci unsigned long irq_1) 6348c2ecf20Sopenharmony_ci{ 6358c2ecf20Sopenharmony_ci orion_xor0_shared_resources[0].start = mapbase_low; 6368c2ecf20Sopenharmony_ci orion_xor0_shared_resources[0].end = mapbase_low + 0xff; 6378c2ecf20Sopenharmony_ci orion_xor0_shared_resources[1].start = mapbase_high; 6388c2ecf20Sopenharmony_ci orion_xor0_shared_resources[1].end = mapbase_high + 0xff; 6398c2ecf20Sopenharmony_ci 6408c2ecf20Sopenharmony_ci orion_xor0_shared_resources[2].start = irq_0; 6418c2ecf20Sopenharmony_ci orion_xor0_shared_resources[2].end = irq_0; 6428c2ecf20Sopenharmony_ci orion_xor0_shared_resources[3].start = irq_1; 6438c2ecf20Sopenharmony_ci orion_xor0_shared_resources[3].end = irq_1; 6448c2ecf20Sopenharmony_ci 6458c2ecf20Sopenharmony_ci dma_cap_set(DMA_MEMCPY, orion_xor0_channels_data[0].cap_mask); 6468c2ecf20Sopenharmony_ci dma_cap_set(DMA_XOR, orion_xor0_channels_data[0].cap_mask); 6478c2ecf20Sopenharmony_ci 6488c2ecf20Sopenharmony_ci dma_cap_set(DMA_MEMCPY, orion_xor0_channels_data[1].cap_mask); 6498c2ecf20Sopenharmony_ci dma_cap_set(DMA_XOR, orion_xor0_channels_data[1].cap_mask); 6508c2ecf20Sopenharmony_ci 6518c2ecf20Sopenharmony_ci platform_device_register(&orion_xor0_shared); 6528c2ecf20Sopenharmony_ci} 6538c2ecf20Sopenharmony_ci 6548c2ecf20Sopenharmony_ci/***************************************************************************** 6558c2ecf20Sopenharmony_ci * XOR1 6568c2ecf20Sopenharmony_ci ****************************************************************************/ 6578c2ecf20Sopenharmony_cistatic struct resource orion_xor1_shared_resources[] = { 6588c2ecf20Sopenharmony_ci { 6598c2ecf20Sopenharmony_ci .name = "xor 1 low", 6608c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 6618c2ecf20Sopenharmony_ci }, { 6628c2ecf20Sopenharmony_ci .name = "xor 1 high", 6638c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 6648c2ecf20Sopenharmony_ci }, { 6658c2ecf20Sopenharmony_ci .name = "irq channel 0", 6668c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 6678c2ecf20Sopenharmony_ci }, { 6688c2ecf20Sopenharmony_ci .name = "irq channel 1", 6698c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 6708c2ecf20Sopenharmony_ci }, 6718c2ecf20Sopenharmony_ci}; 6728c2ecf20Sopenharmony_ci 6738c2ecf20Sopenharmony_cistatic struct mv_xor_channel_data orion_xor1_channels_data[2]; 6748c2ecf20Sopenharmony_ci 6758c2ecf20Sopenharmony_cistatic struct mv_xor_platform_data orion_xor1_pdata = { 6768c2ecf20Sopenharmony_ci .channels = orion_xor1_channels_data, 6778c2ecf20Sopenharmony_ci}; 6788c2ecf20Sopenharmony_ci 6798c2ecf20Sopenharmony_cistatic struct platform_device orion_xor1_shared = { 6808c2ecf20Sopenharmony_ci .name = MV_XOR_NAME, 6818c2ecf20Sopenharmony_ci .id = 1, 6828c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(orion_xor1_shared_resources), 6838c2ecf20Sopenharmony_ci .resource = orion_xor1_shared_resources, 6848c2ecf20Sopenharmony_ci .dev = { 6858c2ecf20Sopenharmony_ci .dma_mask = &orion_xor_dmamask, 6868c2ecf20Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 6878c2ecf20Sopenharmony_ci .platform_data = &orion_xor1_pdata, 6888c2ecf20Sopenharmony_ci }, 6898c2ecf20Sopenharmony_ci}; 6908c2ecf20Sopenharmony_ci 6918c2ecf20Sopenharmony_civoid __init orion_xor1_init(unsigned long mapbase_low, 6928c2ecf20Sopenharmony_ci unsigned long mapbase_high, 6938c2ecf20Sopenharmony_ci unsigned long irq_0, 6948c2ecf20Sopenharmony_ci unsigned long irq_1) 6958c2ecf20Sopenharmony_ci{ 6968c2ecf20Sopenharmony_ci orion_xor1_shared_resources[0].start = mapbase_low; 6978c2ecf20Sopenharmony_ci orion_xor1_shared_resources[0].end = mapbase_low + 0xff; 6988c2ecf20Sopenharmony_ci orion_xor1_shared_resources[1].start = mapbase_high; 6998c2ecf20Sopenharmony_ci orion_xor1_shared_resources[1].end = mapbase_high + 0xff; 7008c2ecf20Sopenharmony_ci 7018c2ecf20Sopenharmony_ci orion_xor1_shared_resources[2].start = irq_0; 7028c2ecf20Sopenharmony_ci orion_xor1_shared_resources[2].end = irq_0; 7038c2ecf20Sopenharmony_ci orion_xor1_shared_resources[3].start = irq_1; 7048c2ecf20Sopenharmony_ci orion_xor1_shared_resources[3].end = irq_1; 7058c2ecf20Sopenharmony_ci 7068c2ecf20Sopenharmony_ci dma_cap_set(DMA_MEMCPY, orion_xor1_channels_data[0].cap_mask); 7078c2ecf20Sopenharmony_ci dma_cap_set(DMA_XOR, orion_xor1_channels_data[0].cap_mask); 7088c2ecf20Sopenharmony_ci 7098c2ecf20Sopenharmony_ci dma_cap_set(DMA_MEMCPY, orion_xor1_channels_data[1].cap_mask); 7108c2ecf20Sopenharmony_ci dma_cap_set(DMA_XOR, orion_xor1_channels_data[1].cap_mask); 7118c2ecf20Sopenharmony_ci 7128c2ecf20Sopenharmony_ci platform_device_register(&orion_xor1_shared); 7138c2ecf20Sopenharmony_ci} 7148c2ecf20Sopenharmony_ci 7158c2ecf20Sopenharmony_ci/***************************************************************************** 7168c2ecf20Sopenharmony_ci * EHCI 7178c2ecf20Sopenharmony_ci ****************************************************************************/ 7188c2ecf20Sopenharmony_cistatic struct orion_ehci_data orion_ehci_data; 7198c2ecf20Sopenharmony_cistatic u64 ehci_dmamask = DMA_BIT_MASK(32); 7208c2ecf20Sopenharmony_ci 7218c2ecf20Sopenharmony_ci 7228c2ecf20Sopenharmony_ci/***************************************************************************** 7238c2ecf20Sopenharmony_ci * EHCI0 7248c2ecf20Sopenharmony_ci ****************************************************************************/ 7258c2ecf20Sopenharmony_cistatic struct resource orion_ehci_resources[2]; 7268c2ecf20Sopenharmony_ci 7278c2ecf20Sopenharmony_cistatic struct platform_device orion_ehci = { 7288c2ecf20Sopenharmony_ci .name = "orion-ehci", 7298c2ecf20Sopenharmony_ci .id = 0, 7308c2ecf20Sopenharmony_ci .dev = { 7318c2ecf20Sopenharmony_ci .dma_mask = &ehci_dmamask, 7328c2ecf20Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 7338c2ecf20Sopenharmony_ci .platform_data = &orion_ehci_data, 7348c2ecf20Sopenharmony_ci }, 7358c2ecf20Sopenharmony_ci}; 7368c2ecf20Sopenharmony_ci 7378c2ecf20Sopenharmony_civoid __init orion_ehci_init(unsigned long mapbase, 7388c2ecf20Sopenharmony_ci unsigned long irq, 7398c2ecf20Sopenharmony_ci enum orion_ehci_phy_ver phy_version) 7408c2ecf20Sopenharmony_ci{ 7418c2ecf20Sopenharmony_ci orion_ehci_data.phy_version = phy_version; 7428c2ecf20Sopenharmony_ci fill_resources_irq(&orion_ehci, orion_ehci_resources, mapbase, SZ_4K - 1, 7438c2ecf20Sopenharmony_ci irq); 7448c2ecf20Sopenharmony_ci 7458c2ecf20Sopenharmony_ci platform_device_register(&orion_ehci); 7468c2ecf20Sopenharmony_ci} 7478c2ecf20Sopenharmony_ci 7488c2ecf20Sopenharmony_ci/***************************************************************************** 7498c2ecf20Sopenharmony_ci * EHCI1 7508c2ecf20Sopenharmony_ci ****************************************************************************/ 7518c2ecf20Sopenharmony_cistatic struct resource orion_ehci_1_resources[2]; 7528c2ecf20Sopenharmony_ci 7538c2ecf20Sopenharmony_cistatic struct platform_device orion_ehci_1 = { 7548c2ecf20Sopenharmony_ci .name = "orion-ehci", 7558c2ecf20Sopenharmony_ci .id = 1, 7568c2ecf20Sopenharmony_ci .dev = { 7578c2ecf20Sopenharmony_ci .dma_mask = &ehci_dmamask, 7588c2ecf20Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 7598c2ecf20Sopenharmony_ci .platform_data = &orion_ehci_data, 7608c2ecf20Sopenharmony_ci }, 7618c2ecf20Sopenharmony_ci}; 7628c2ecf20Sopenharmony_ci 7638c2ecf20Sopenharmony_civoid __init orion_ehci_1_init(unsigned long mapbase, 7648c2ecf20Sopenharmony_ci unsigned long irq) 7658c2ecf20Sopenharmony_ci{ 7668c2ecf20Sopenharmony_ci fill_resources_irq(&orion_ehci_1, orion_ehci_1_resources, 7678c2ecf20Sopenharmony_ci mapbase, SZ_4K - 1, irq); 7688c2ecf20Sopenharmony_ci 7698c2ecf20Sopenharmony_ci platform_device_register(&orion_ehci_1); 7708c2ecf20Sopenharmony_ci} 7718c2ecf20Sopenharmony_ci 7728c2ecf20Sopenharmony_ci/***************************************************************************** 7738c2ecf20Sopenharmony_ci * EHCI2 7748c2ecf20Sopenharmony_ci ****************************************************************************/ 7758c2ecf20Sopenharmony_cistatic struct resource orion_ehci_2_resources[2]; 7768c2ecf20Sopenharmony_ci 7778c2ecf20Sopenharmony_cistatic struct platform_device orion_ehci_2 = { 7788c2ecf20Sopenharmony_ci .name = "orion-ehci", 7798c2ecf20Sopenharmony_ci .id = 2, 7808c2ecf20Sopenharmony_ci .dev = { 7818c2ecf20Sopenharmony_ci .dma_mask = &ehci_dmamask, 7828c2ecf20Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 7838c2ecf20Sopenharmony_ci .platform_data = &orion_ehci_data, 7848c2ecf20Sopenharmony_ci }, 7858c2ecf20Sopenharmony_ci}; 7868c2ecf20Sopenharmony_ci 7878c2ecf20Sopenharmony_civoid __init orion_ehci_2_init(unsigned long mapbase, 7888c2ecf20Sopenharmony_ci unsigned long irq) 7898c2ecf20Sopenharmony_ci{ 7908c2ecf20Sopenharmony_ci fill_resources_irq(&orion_ehci_2, orion_ehci_2_resources, 7918c2ecf20Sopenharmony_ci mapbase, SZ_4K - 1, irq); 7928c2ecf20Sopenharmony_ci 7938c2ecf20Sopenharmony_ci platform_device_register(&orion_ehci_2); 7948c2ecf20Sopenharmony_ci} 7958c2ecf20Sopenharmony_ci 7968c2ecf20Sopenharmony_ci/***************************************************************************** 7978c2ecf20Sopenharmony_ci * SATA 7988c2ecf20Sopenharmony_ci ****************************************************************************/ 7998c2ecf20Sopenharmony_cistatic struct resource orion_sata_resources[2] = { 8008c2ecf20Sopenharmony_ci { 8018c2ecf20Sopenharmony_ci .name = "sata base", 8028c2ecf20Sopenharmony_ci }, { 8038c2ecf20Sopenharmony_ci .name = "sata irq", 8048c2ecf20Sopenharmony_ci }, 8058c2ecf20Sopenharmony_ci}; 8068c2ecf20Sopenharmony_ci 8078c2ecf20Sopenharmony_cistatic struct platform_device orion_sata = { 8088c2ecf20Sopenharmony_ci .name = "sata_mv", 8098c2ecf20Sopenharmony_ci .id = 0, 8108c2ecf20Sopenharmony_ci .dev = { 8118c2ecf20Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 8128c2ecf20Sopenharmony_ci }, 8138c2ecf20Sopenharmony_ci}; 8148c2ecf20Sopenharmony_ci 8158c2ecf20Sopenharmony_civoid __init orion_sata_init(struct mv_sata_platform_data *sata_data, 8168c2ecf20Sopenharmony_ci unsigned long mapbase, 8178c2ecf20Sopenharmony_ci unsigned long irq) 8188c2ecf20Sopenharmony_ci{ 8198c2ecf20Sopenharmony_ci orion_sata.dev.platform_data = sata_data; 8208c2ecf20Sopenharmony_ci fill_resources_irq(&orion_sata, orion_sata_resources, 8218c2ecf20Sopenharmony_ci mapbase, 0x5000 - 1, irq); 8228c2ecf20Sopenharmony_ci 8238c2ecf20Sopenharmony_ci platform_device_register(&orion_sata); 8248c2ecf20Sopenharmony_ci} 8258c2ecf20Sopenharmony_ci 8268c2ecf20Sopenharmony_ci/***************************************************************************** 8278c2ecf20Sopenharmony_ci * Cryptographic Engines and Security Accelerator (CESA) 8288c2ecf20Sopenharmony_ci ****************************************************************************/ 8298c2ecf20Sopenharmony_cistatic struct resource orion_crypto_resources[] = { 8308c2ecf20Sopenharmony_ci { 8318c2ecf20Sopenharmony_ci .name = "regs", 8328c2ecf20Sopenharmony_ci }, { 8338c2ecf20Sopenharmony_ci .name = "crypto interrupt", 8348c2ecf20Sopenharmony_ci }, { 8358c2ecf20Sopenharmony_ci .name = "sram", 8368c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 8378c2ecf20Sopenharmony_ci }, 8388c2ecf20Sopenharmony_ci}; 8398c2ecf20Sopenharmony_ci 8408c2ecf20Sopenharmony_cistatic struct platform_device orion_crypto = { 8418c2ecf20Sopenharmony_ci .name = "mv_crypto", 8428c2ecf20Sopenharmony_ci .id = -1, 8438c2ecf20Sopenharmony_ci}; 8448c2ecf20Sopenharmony_ci 8458c2ecf20Sopenharmony_civoid __init orion_crypto_init(unsigned long mapbase, 8468c2ecf20Sopenharmony_ci unsigned long srambase, 8478c2ecf20Sopenharmony_ci unsigned long sram_size, 8488c2ecf20Sopenharmony_ci unsigned long irq) 8498c2ecf20Sopenharmony_ci{ 8508c2ecf20Sopenharmony_ci fill_resources_irq(&orion_crypto, orion_crypto_resources, 8518c2ecf20Sopenharmony_ci mapbase, 0xffff, irq); 8528c2ecf20Sopenharmony_ci orion_crypto.num_resources = 3; 8538c2ecf20Sopenharmony_ci orion_crypto_resources[2].start = srambase; 8548c2ecf20Sopenharmony_ci orion_crypto_resources[2].end = srambase + sram_size - 1; 8558c2ecf20Sopenharmony_ci 8568c2ecf20Sopenharmony_ci platform_device_register(&orion_crypto); 8578c2ecf20Sopenharmony_ci} 858