18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * arch/arm/mach-ixp4xx/omixp-setup.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * omicron ixp4xx board setup 68c2ecf20Sopenharmony_ci * Copyright (C) 2009 OMICRON electronics GmbH 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * based nslu2-setup.c, ixdp425-setup.c: 98c2ecf20Sopenharmony_ci * Copyright (C) 2003-2004 MontaVista Software, Inc. 108c2ecf20Sopenharmony_ci */ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <linux/kernel.h> 138c2ecf20Sopenharmony_ci#include <linux/serial.h> 148c2ecf20Sopenharmony_ci#include <linux/serial_8250.h> 158c2ecf20Sopenharmony_ci#include <linux/mtd/mtd.h> 168c2ecf20Sopenharmony_ci#include <linux/mtd/partitions.h> 178c2ecf20Sopenharmony_ci#include <linux/leds.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#include <asm/setup.h> 208c2ecf20Sopenharmony_ci#include <asm/memory.h> 218c2ecf20Sopenharmony_ci#include <asm/mach-types.h> 228c2ecf20Sopenharmony_ci#include <asm/mach/arch.h> 238c2ecf20Sopenharmony_ci#include <asm/mach/flash.h> 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci#include <mach/hardware.h> 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#include "irqs.h" 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_cistatic struct resource omixp_flash_resources[] = { 308c2ecf20Sopenharmony_ci { 318c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 328c2ecf20Sopenharmony_ci }, { 338c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 348c2ecf20Sopenharmony_ci }, 358c2ecf20Sopenharmony_ci}; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_cistatic struct mtd_partition omixp_partitions[] = { 388c2ecf20Sopenharmony_ci { 398c2ecf20Sopenharmony_ci .name = "Recovery Bootloader", 408c2ecf20Sopenharmony_ci .size = 0x00020000, 418c2ecf20Sopenharmony_ci .offset = 0, 428c2ecf20Sopenharmony_ci }, { 438c2ecf20Sopenharmony_ci .name = "Calibration Data", 448c2ecf20Sopenharmony_ci .size = 0x00020000, 458c2ecf20Sopenharmony_ci .offset = 0x00020000, 468c2ecf20Sopenharmony_ci }, { 478c2ecf20Sopenharmony_ci .name = "Recovery FPGA", 488c2ecf20Sopenharmony_ci .size = 0x00020000, 498c2ecf20Sopenharmony_ci .offset = 0x00040000, 508c2ecf20Sopenharmony_ci }, { 518c2ecf20Sopenharmony_ci .name = "Release Bootloader", 528c2ecf20Sopenharmony_ci .size = 0x00020000, 538c2ecf20Sopenharmony_ci .offset = 0x00060000, 548c2ecf20Sopenharmony_ci }, { 558c2ecf20Sopenharmony_ci .name = "Release FPGA", 568c2ecf20Sopenharmony_ci .size = 0x00020000, 578c2ecf20Sopenharmony_ci .offset = 0x00080000, 588c2ecf20Sopenharmony_ci }, { 598c2ecf20Sopenharmony_ci .name = "Kernel", 608c2ecf20Sopenharmony_ci .size = 0x00160000, 618c2ecf20Sopenharmony_ci .offset = 0x000a0000, 628c2ecf20Sopenharmony_ci }, { 638c2ecf20Sopenharmony_ci .name = "Filesystem", 648c2ecf20Sopenharmony_ci .size = 0x00C00000, 658c2ecf20Sopenharmony_ci .offset = 0x00200000, 668c2ecf20Sopenharmony_ci }, { 678c2ecf20Sopenharmony_ci .name = "Persistent Storage", 688c2ecf20Sopenharmony_ci .size = 0x00200000, 698c2ecf20Sopenharmony_ci .offset = 0x00E00000, 708c2ecf20Sopenharmony_ci }, 718c2ecf20Sopenharmony_ci}; 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_cistatic struct flash_platform_data omixp_flash_data[] = { 748c2ecf20Sopenharmony_ci { 758c2ecf20Sopenharmony_ci .map_name = "cfi_probe", 768c2ecf20Sopenharmony_ci .parts = omixp_partitions, 778c2ecf20Sopenharmony_ci .nr_parts = ARRAY_SIZE(omixp_partitions), 788c2ecf20Sopenharmony_ci }, { 798c2ecf20Sopenharmony_ci .map_name = "cfi_probe", 808c2ecf20Sopenharmony_ci .parts = NULL, 818c2ecf20Sopenharmony_ci .nr_parts = 0, 828c2ecf20Sopenharmony_ci }, 838c2ecf20Sopenharmony_ci}; 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_cistatic struct platform_device omixp_flash_device[] = { 868c2ecf20Sopenharmony_ci { 878c2ecf20Sopenharmony_ci .name = "IXP4XX-Flash", 888c2ecf20Sopenharmony_ci .id = 0, 898c2ecf20Sopenharmony_ci .dev = { 908c2ecf20Sopenharmony_ci .platform_data = &omixp_flash_data[0], 918c2ecf20Sopenharmony_ci }, 928c2ecf20Sopenharmony_ci .resource = &omixp_flash_resources[0], 938c2ecf20Sopenharmony_ci .num_resources = 1, 948c2ecf20Sopenharmony_ci }, { 958c2ecf20Sopenharmony_ci .name = "IXP4XX-Flash", 968c2ecf20Sopenharmony_ci .id = 1, 978c2ecf20Sopenharmony_ci .dev = { 988c2ecf20Sopenharmony_ci .platform_data = &omixp_flash_data[1], 998c2ecf20Sopenharmony_ci }, 1008c2ecf20Sopenharmony_ci .resource = &omixp_flash_resources[1], 1018c2ecf20Sopenharmony_ci .num_resources = 1, 1028c2ecf20Sopenharmony_ci }, 1038c2ecf20Sopenharmony_ci}; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci/* Swap UART's - These boards have the console on UART2. The following 1068c2ecf20Sopenharmony_ci * configuration is used: 1078c2ecf20Sopenharmony_ci * ttyS0 .. UART2 1088c2ecf20Sopenharmony_ci * ttyS1 .. UART1 1098c2ecf20Sopenharmony_ci * This way standard images can be used with the kernel that expect 1108c2ecf20Sopenharmony_ci * the console on ttyS0. 1118c2ecf20Sopenharmony_ci */ 1128c2ecf20Sopenharmony_cistatic struct resource omixp_uart_resources[] = { 1138c2ecf20Sopenharmony_ci { 1148c2ecf20Sopenharmony_ci .start = IXP4XX_UART2_BASE_PHYS, 1158c2ecf20Sopenharmony_ci .end = IXP4XX_UART2_BASE_PHYS + 0x0fff, 1168c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 1178c2ecf20Sopenharmony_ci }, { 1188c2ecf20Sopenharmony_ci .start = IXP4XX_UART1_BASE_PHYS, 1198c2ecf20Sopenharmony_ci .end = IXP4XX_UART1_BASE_PHYS + 0x0fff, 1208c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 1218c2ecf20Sopenharmony_ci }, 1228c2ecf20Sopenharmony_ci}; 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_cistatic struct plat_serial8250_port omixp_uart_data[] = { 1258c2ecf20Sopenharmony_ci { 1268c2ecf20Sopenharmony_ci .mapbase = IXP4XX_UART2_BASE_PHYS, 1278c2ecf20Sopenharmony_ci .membase = (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET, 1288c2ecf20Sopenharmony_ci .irq = IRQ_IXP4XX_UART2, 1298c2ecf20Sopenharmony_ci .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, 1308c2ecf20Sopenharmony_ci .iotype = UPIO_MEM, 1318c2ecf20Sopenharmony_ci .regshift = 2, 1328c2ecf20Sopenharmony_ci .uartclk = IXP4XX_UART_XTAL, 1338c2ecf20Sopenharmony_ci }, { 1348c2ecf20Sopenharmony_ci .mapbase = IXP4XX_UART1_BASE_PHYS, 1358c2ecf20Sopenharmony_ci .membase = (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET, 1368c2ecf20Sopenharmony_ci .irq = IRQ_IXP4XX_UART1, 1378c2ecf20Sopenharmony_ci .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, 1388c2ecf20Sopenharmony_ci .iotype = UPIO_MEM, 1398c2ecf20Sopenharmony_ci .regshift = 2, 1408c2ecf20Sopenharmony_ci .uartclk = IXP4XX_UART_XTAL, 1418c2ecf20Sopenharmony_ci }, { 1428c2ecf20Sopenharmony_ci /* list termination */ 1438c2ecf20Sopenharmony_ci } 1448c2ecf20Sopenharmony_ci}; 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_cistatic struct platform_device omixp_uart = { 1478c2ecf20Sopenharmony_ci .name = "serial8250", 1488c2ecf20Sopenharmony_ci .id = PLAT8250_DEV_PLATFORM, 1498c2ecf20Sopenharmony_ci .dev.platform_data = omixp_uart_data, 1508c2ecf20Sopenharmony_ci .num_resources = 2, 1518c2ecf20Sopenharmony_ci .resource = omixp_uart_resources, 1528c2ecf20Sopenharmony_ci}; 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_cistatic struct gpio_led mic256_led_pins[] = { 1558c2ecf20Sopenharmony_ci { 1568c2ecf20Sopenharmony_ci .name = "LED-A", 1578c2ecf20Sopenharmony_ci .gpio = 7, 1588c2ecf20Sopenharmony_ci }, 1598c2ecf20Sopenharmony_ci}; 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_cistatic struct gpio_led_platform_data mic256_led_data = { 1628c2ecf20Sopenharmony_ci .num_leds = ARRAY_SIZE(mic256_led_pins), 1638c2ecf20Sopenharmony_ci .leds = mic256_led_pins, 1648c2ecf20Sopenharmony_ci}; 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_cistatic struct platform_device mic256_leds = { 1678c2ecf20Sopenharmony_ci .name = "leds-gpio", 1688c2ecf20Sopenharmony_ci .id = -1, 1698c2ecf20Sopenharmony_ci .dev.platform_data = &mic256_led_data, 1708c2ecf20Sopenharmony_ci}; 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_ci/* Built-in 10/100 Ethernet MAC interfaces */ 1738c2ecf20Sopenharmony_cistatic struct resource ixp425_npeb_resources[] = { 1748c2ecf20Sopenharmony_ci { 1758c2ecf20Sopenharmony_ci .start = IXP4XX_EthB_BASE_PHYS, 1768c2ecf20Sopenharmony_ci .end = IXP4XX_EthB_BASE_PHYS + 0x0fff, 1778c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 1788c2ecf20Sopenharmony_ci }, 1798c2ecf20Sopenharmony_ci}; 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_cistatic struct resource ixp425_npec_resources[] = { 1828c2ecf20Sopenharmony_ci { 1838c2ecf20Sopenharmony_ci .start = IXP4XX_EthC_BASE_PHYS, 1848c2ecf20Sopenharmony_ci .end = IXP4XX_EthC_BASE_PHYS + 0x0fff, 1858c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 1868c2ecf20Sopenharmony_ci }, 1878c2ecf20Sopenharmony_ci}; 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_cistatic struct eth_plat_info ixdp425_plat_eth[] = { 1908c2ecf20Sopenharmony_ci { 1918c2ecf20Sopenharmony_ci .phy = 0, 1928c2ecf20Sopenharmony_ci .rxq = 3, 1938c2ecf20Sopenharmony_ci .txreadyq = 20, 1948c2ecf20Sopenharmony_ci }, { 1958c2ecf20Sopenharmony_ci .phy = 1, 1968c2ecf20Sopenharmony_ci .rxq = 4, 1978c2ecf20Sopenharmony_ci .txreadyq = 21, 1988c2ecf20Sopenharmony_ci }, 1998c2ecf20Sopenharmony_ci}; 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_cistatic struct platform_device ixdp425_eth[] = { 2028c2ecf20Sopenharmony_ci { 2038c2ecf20Sopenharmony_ci .name = "ixp4xx_eth", 2048c2ecf20Sopenharmony_ci .id = IXP4XX_ETH_NPEB, 2058c2ecf20Sopenharmony_ci .dev.platform_data = ixdp425_plat_eth, 2068c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(ixp425_npeb_resources), 2078c2ecf20Sopenharmony_ci .resource = ixp425_npeb_resources, 2088c2ecf20Sopenharmony_ci }, { 2098c2ecf20Sopenharmony_ci .name = "ixp4xx_eth", 2108c2ecf20Sopenharmony_ci .id = IXP4XX_ETH_NPEC, 2118c2ecf20Sopenharmony_ci .dev.platform_data = ixdp425_plat_eth + 1, 2128c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(ixp425_npec_resources), 2138c2ecf20Sopenharmony_ci .resource = ixp425_npec_resources, 2148c2ecf20Sopenharmony_ci }, 2158c2ecf20Sopenharmony_ci}; 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_cistatic struct platform_device *devixp_pldev[] __initdata = { 2198c2ecf20Sopenharmony_ci &omixp_uart, 2208c2ecf20Sopenharmony_ci &omixp_flash_device[0], 2218c2ecf20Sopenharmony_ci &ixdp425_eth[0], 2228c2ecf20Sopenharmony_ci &ixdp425_eth[1], 2238c2ecf20Sopenharmony_ci}; 2248c2ecf20Sopenharmony_ci 2258c2ecf20Sopenharmony_cistatic struct platform_device *mic256_pldev[] __initdata = { 2268c2ecf20Sopenharmony_ci &omixp_uart, 2278c2ecf20Sopenharmony_ci &omixp_flash_device[0], 2288c2ecf20Sopenharmony_ci &mic256_leds, 2298c2ecf20Sopenharmony_ci &ixdp425_eth[0], 2308c2ecf20Sopenharmony_ci &ixdp425_eth[1], 2318c2ecf20Sopenharmony_ci}; 2328c2ecf20Sopenharmony_ci 2338c2ecf20Sopenharmony_cistatic struct platform_device *miccpt_pldev[] __initdata = { 2348c2ecf20Sopenharmony_ci &omixp_uart, 2358c2ecf20Sopenharmony_ci &omixp_flash_device[0], 2368c2ecf20Sopenharmony_ci &omixp_flash_device[1], 2378c2ecf20Sopenharmony_ci &ixdp425_eth[0], 2388c2ecf20Sopenharmony_ci &ixdp425_eth[1], 2398c2ecf20Sopenharmony_ci}; 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_cistatic void __init omixp_init(void) 2428c2ecf20Sopenharmony_ci{ 2438c2ecf20Sopenharmony_ci ixp4xx_sys_init(); 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci /* 16MiB Boot Flash */ 2468c2ecf20Sopenharmony_ci omixp_flash_resources[0].start = IXP4XX_EXP_BUS_BASE(0); 2478c2ecf20Sopenharmony_ci omixp_flash_resources[0].end = IXP4XX_EXP_BUS_END(0); 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_ci /* 32 MiB Data Flash */ 2508c2ecf20Sopenharmony_ci omixp_flash_resources[1].start = IXP4XX_EXP_BUS_BASE(2); 2518c2ecf20Sopenharmony_ci omixp_flash_resources[1].end = IXP4XX_EXP_BUS_END(2); 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci if (machine_is_devixp()) 2548c2ecf20Sopenharmony_ci platform_add_devices(devixp_pldev, ARRAY_SIZE(devixp_pldev)); 2558c2ecf20Sopenharmony_ci else if (machine_is_miccpt()) 2568c2ecf20Sopenharmony_ci platform_add_devices(miccpt_pldev, ARRAY_SIZE(miccpt_pldev)); 2578c2ecf20Sopenharmony_ci else if (machine_is_mic256()) 2588c2ecf20Sopenharmony_ci platform_add_devices(mic256_pldev, ARRAY_SIZE(mic256_pldev)); 2598c2ecf20Sopenharmony_ci} 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci#ifdef CONFIG_MACH_DEVIXP 2628c2ecf20Sopenharmony_ciMACHINE_START(DEVIXP, "Omicron DEVIXP") 2638c2ecf20Sopenharmony_ci .atag_offset = 0x100, 2648c2ecf20Sopenharmony_ci .map_io = ixp4xx_map_io, 2658c2ecf20Sopenharmony_ci .init_early = ixp4xx_init_early, 2668c2ecf20Sopenharmony_ci .init_irq = ixp4xx_init_irq, 2678c2ecf20Sopenharmony_ci .init_time = ixp4xx_timer_init, 2688c2ecf20Sopenharmony_ci .init_machine = omixp_init, 2698c2ecf20Sopenharmony_ci .restart = ixp4xx_restart, 2708c2ecf20Sopenharmony_ciMACHINE_END 2718c2ecf20Sopenharmony_ci#endif 2728c2ecf20Sopenharmony_ci 2738c2ecf20Sopenharmony_ci#ifdef CONFIG_MACH_MICCPT 2748c2ecf20Sopenharmony_ciMACHINE_START(MICCPT, "Omicron MICCPT") 2758c2ecf20Sopenharmony_ci .atag_offset = 0x100, 2768c2ecf20Sopenharmony_ci .map_io = ixp4xx_map_io, 2778c2ecf20Sopenharmony_ci .init_early = ixp4xx_init_early, 2788c2ecf20Sopenharmony_ci .init_irq = ixp4xx_init_irq, 2798c2ecf20Sopenharmony_ci .init_time = ixp4xx_timer_init, 2808c2ecf20Sopenharmony_ci .init_machine = omixp_init, 2818c2ecf20Sopenharmony_ci#if defined(CONFIG_PCI) 2828c2ecf20Sopenharmony_ci .dma_zone_size = SZ_64M, 2838c2ecf20Sopenharmony_ci#endif 2848c2ecf20Sopenharmony_ci .restart = ixp4xx_restart, 2858c2ecf20Sopenharmony_ciMACHINE_END 2868c2ecf20Sopenharmony_ci#endif 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci#ifdef CONFIG_MACH_MIC256 2898c2ecf20Sopenharmony_ciMACHINE_START(MIC256, "Omicron MIC256") 2908c2ecf20Sopenharmony_ci .atag_offset = 0x100, 2918c2ecf20Sopenharmony_ci .map_io = ixp4xx_map_io, 2928c2ecf20Sopenharmony_ci .init_early = ixp4xx_init_early, 2938c2ecf20Sopenharmony_ci .init_irq = ixp4xx_init_irq, 2948c2ecf20Sopenharmony_ci .init_time = ixp4xx_timer_init, 2958c2ecf20Sopenharmony_ci .init_machine = omixp_init, 2968c2ecf20Sopenharmony_ci .restart = ixp4xx_restart, 2978c2ecf20Sopenharmony_ciMACHINE_END 2988c2ecf20Sopenharmony_ci#endif 299