// SPDX-License-Identifier: GPL-2.0-only
/*
 * arch/arm/mach-ixp4xx/omixp-setup.c
 *
 * omicron ixp4xx board setup
 *      Copyright (C) 2009 OMICRON electronics GmbH
 *
 * based nslu2-setup.c, ixdp425-setup.c:
 *      Copyright (C) 2003-2004 MontaVista Software, Inc.
 */

#include <linux/kernel.h>
#include <linux/serial.h>
#include <linux/serial_8250.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/leds.h>

#include <asm/setup.h>
#include <asm/memory.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/flash.h>

#include <mach/hardware.h>

#include "irqs.h"

static struct resource omixp_flash_resources[] = {
	{
		.flags	= IORESOURCE_MEM,
	}, {
		.flags	= IORESOURCE_MEM,
	},
};

static struct mtd_partition omixp_partitions[] = {
	{
		.name =		"Recovery Bootloader",
		.size =		0x00020000,
		.offset =	0,
	}, {
		.name =		"Calibration Data",
		.size =		0x00020000,
		.offset =	0x00020000,
	}, {
		.name =		"Recovery FPGA",
		.size =		0x00020000,
		.offset =	0x00040000,
	}, {
		.name =		"Release Bootloader",
		.size =		0x00020000,
		.offset =	0x00060000,
	}, {
		.name =		"Release FPGA",
		.size =		0x00020000,
		.offset =	0x00080000,
	}, {
		.name =		"Kernel",
		.size =		0x00160000,
		.offset =	0x000a0000,
	}, {
		.name =		"Filesystem",
		.size =		0x00C00000,
		.offset =	0x00200000,
	}, {
		.name =		"Persistent Storage",
		.size =		0x00200000,
		.offset =	0x00E00000,
	},
};

static struct flash_platform_data omixp_flash_data[] = {
	{
		.map_name	= "cfi_probe",
		.parts		= omixp_partitions,
		.nr_parts	= ARRAY_SIZE(omixp_partitions),
	}, {
		.map_name	= "cfi_probe",
		.parts		= NULL,
		.nr_parts	= 0,
	},
};

static struct platform_device omixp_flash_device[] = {
	{
		.name		= "IXP4XX-Flash",
		.id		= 0,
		.dev = {
			.platform_data = &omixp_flash_data[0],
		},
		.resource = &omixp_flash_resources[0],
		.num_resources = 1,
	}, {
		.name		= "IXP4XX-Flash",
		.id		= 1,
		.dev = {
			.platform_data = &omixp_flash_data[1],
		},
		.resource = &omixp_flash_resources[1],
		.num_resources = 1,
	},
};

/* Swap UART's - These boards have the console on UART2. The following
 * configuration is used:
 *      ttyS0 .. UART2
 *      ttyS1 .. UART1
 * This way standard images can be used with the kernel that expect
 * the console on ttyS0.
 */
static struct resource omixp_uart_resources[] = {
	{
		.start		= IXP4XX_UART2_BASE_PHYS,
		.end		= IXP4XX_UART2_BASE_PHYS + 0x0fff,
		.flags		= IORESOURCE_MEM,
	}, {
		.start		= IXP4XX_UART1_BASE_PHYS,
		.end		= IXP4XX_UART1_BASE_PHYS + 0x0fff,
		.flags		= IORESOURCE_MEM,
	},
};

static struct plat_serial8250_port omixp_uart_data[] = {
	{
		.mapbase	= IXP4XX_UART2_BASE_PHYS,
		.membase	= (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET,
		.irq		= IRQ_IXP4XX_UART2,
		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
		.iotype		= UPIO_MEM,
		.regshift	= 2,
		.uartclk	= IXP4XX_UART_XTAL,
	}, {
		.mapbase	= IXP4XX_UART1_BASE_PHYS,
		.membase	= (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET,
		.irq		= IRQ_IXP4XX_UART1,
		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
		.iotype		= UPIO_MEM,
		.regshift	= 2,
		.uartclk	= IXP4XX_UART_XTAL,
	}, {
		/* list termination */
	}
};

static struct platform_device omixp_uart = {
	.name			= "serial8250",
	.id			= PLAT8250_DEV_PLATFORM,
	.dev.platform_data	= omixp_uart_data,
	.num_resources		= 2,
	.resource		= omixp_uart_resources,
};

static struct gpio_led mic256_led_pins[] = {
	{
		.name		= "LED-A",
		.gpio		= 7,
	},
};

static struct gpio_led_platform_data mic256_led_data = {
	.num_leds		= ARRAY_SIZE(mic256_led_pins),
	.leds			= mic256_led_pins,
};

static struct platform_device mic256_leds = {
	.name			= "leds-gpio",
	.id			= -1,
	.dev.platform_data	= &mic256_led_data,
};

/* Built-in 10/100 Ethernet MAC interfaces */
static struct eth_plat_info ixdp425_plat_eth[] = {
	{
		.phy		= 0,
		.rxq		= 3,
		.txreadyq	= 20,
	}, {
		.phy		= 1,
		.rxq		= 4,
		.txreadyq	= 21,
	},
};

static struct platform_device ixdp425_eth[] = {
	{
		.name			= "ixp4xx_eth",
		.id			= IXP4XX_ETH_NPEB,
		.dev.platform_data	= ixdp425_plat_eth,
	}, {
		.name			= "ixp4xx_eth",
		.id			= IXP4XX_ETH_NPEC,
		.dev.platform_data	= ixdp425_plat_eth + 1,
	},
};


static struct platform_device *devixp_pldev[] __initdata = {
	&omixp_uart,
	&omixp_flash_device[0],
	&ixdp425_eth[0],
	&ixdp425_eth[1],
};

static struct platform_device *mic256_pldev[] __initdata = {
	&omixp_uart,
	&omixp_flash_device[0],
	&mic256_leds,
	&ixdp425_eth[0],
	&ixdp425_eth[1],
};

static struct platform_device *miccpt_pldev[] __initdata = {
	&omixp_uart,
	&omixp_flash_device[0],
	&omixp_flash_device[1],
	&ixdp425_eth[0],
	&ixdp425_eth[1],
};

static void __init omixp_init(void)
{
	ixp4xx_sys_init();

	/* 16MiB Boot Flash */
	omixp_flash_resources[0].start = IXP4XX_EXP_BUS_BASE(0);
	omixp_flash_resources[0].end   = IXP4XX_EXP_BUS_END(0);

	/* 32 MiB Data Flash */
	omixp_flash_resources[1].start = IXP4XX_EXP_BUS_BASE(2);
	omixp_flash_resources[1].end   = IXP4XX_EXP_BUS_END(2);

	if (machine_is_devixp())
		platform_add_devices(devixp_pldev, ARRAY_SIZE(devixp_pldev));
	else if (machine_is_miccpt())
		platform_add_devices(miccpt_pldev, ARRAY_SIZE(miccpt_pldev));
	else if (machine_is_mic256())
		platform_add_devices(mic256_pldev, ARRAY_SIZE(mic256_pldev));
}

#ifdef CONFIG_MACH_DEVIXP
MACHINE_START(DEVIXP, "Omicron DEVIXP")
	.atag_offset    = 0x100,
	.map_io		= ixp4xx_map_io,
	.init_early	= ixp4xx_init_early,
	.init_irq	= ixp4xx_init_irq,
	.init_time	= ixp4xx_timer_init,
	.init_machine	= omixp_init,
	.restart	= ixp4xx_restart,
MACHINE_END
#endif

#ifdef CONFIG_MACH_MICCPT
MACHINE_START(MICCPT, "Omicron MICCPT")
	.atag_offset    = 0x100,
	.map_io		= ixp4xx_map_io,
	.init_early	= ixp4xx_init_early,
	.init_irq	= ixp4xx_init_irq,
	.init_time	= ixp4xx_timer_init,
	.init_machine	= omixp_init,
#if defined(CONFIG_PCI)
	.dma_zone_size	= SZ_64M,
#endif
	.restart	= ixp4xx_restart,
MACHINE_END
#endif

#ifdef CONFIG_MACH_MIC256
MACHINE_START(MIC256, "Omicron MIC256")
	.atag_offset    = 0x100,
	.map_io		= ixp4xx_map_io,
	.init_early	= ixp4xx_init_early,
	.init_irq	= ixp4xx_init_irq,
	.init_time	= ixp4xx_timer_init,
	.init_machine	= omixp_init,
	.restart	= ixp4xx_restart,
MACHINE_END
#endif
