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