18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * arch/arm/mach-orion5x/kurobox_pro-setup.c 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Maintainer: Ronen Shitrit <rshitrit@marvell.com> 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#include <linux/gpio.h> 118c2ecf20Sopenharmony_ci#include <linux/kernel.h> 128c2ecf20Sopenharmony_ci#include <linux/init.h> 138c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 148c2ecf20Sopenharmony_ci#include <linux/pci.h> 158c2ecf20Sopenharmony_ci#include <linux/irq.h> 168c2ecf20Sopenharmony_ci#include <linux/delay.h> 178c2ecf20Sopenharmony_ci#include <linux/mtd/physmap.h> 188c2ecf20Sopenharmony_ci#include <linux/mtd/rawnand.h> 198c2ecf20Sopenharmony_ci#include <linux/mv643xx_eth.h> 208c2ecf20Sopenharmony_ci#include <linux/i2c.h> 218c2ecf20Sopenharmony_ci#include <linux/serial_reg.h> 228c2ecf20Sopenharmony_ci#include <linux/ata_platform.h> 238c2ecf20Sopenharmony_ci#include <asm/mach-types.h> 248c2ecf20Sopenharmony_ci#include <asm/mach/arch.h> 258c2ecf20Sopenharmony_ci#include <asm/mach/pci.h> 268c2ecf20Sopenharmony_ci#include <linux/platform_data/mtd-orion_nand.h> 278c2ecf20Sopenharmony_ci#include "common.h" 288c2ecf20Sopenharmony_ci#include "mpp.h" 298c2ecf20Sopenharmony_ci#include "orion5x.h" 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci/***************************************************************************** 328c2ecf20Sopenharmony_ci * KUROBOX-PRO Info 338c2ecf20Sopenharmony_ci ****************************************************************************/ 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci/* 368c2ecf20Sopenharmony_ci * 256K NOR flash Device bus boot chip select 378c2ecf20Sopenharmony_ci */ 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci#define KUROBOX_PRO_NOR_BOOT_BASE 0xf4000000 408c2ecf20Sopenharmony_ci#define KUROBOX_PRO_NOR_BOOT_SIZE SZ_256K 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci/* 438c2ecf20Sopenharmony_ci * 256M NAND flash on Device bus chip select 1 448c2ecf20Sopenharmony_ci */ 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci#define KUROBOX_PRO_NAND_BASE 0xfc000000 478c2ecf20Sopenharmony_ci#define KUROBOX_PRO_NAND_SIZE SZ_2M 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci/***************************************************************************** 508c2ecf20Sopenharmony_ci * 256MB NAND Flash on Device bus CS0 518c2ecf20Sopenharmony_ci ****************************************************************************/ 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_cistatic struct mtd_partition kurobox_pro_nand_parts[] = { 548c2ecf20Sopenharmony_ci { 558c2ecf20Sopenharmony_ci .name = "uImage", 568c2ecf20Sopenharmony_ci .offset = 0, 578c2ecf20Sopenharmony_ci .size = SZ_4M, 588c2ecf20Sopenharmony_ci }, { 598c2ecf20Sopenharmony_ci .name = "rootfs", 608c2ecf20Sopenharmony_ci .offset = SZ_4M, 618c2ecf20Sopenharmony_ci .size = SZ_64M, 628c2ecf20Sopenharmony_ci }, { 638c2ecf20Sopenharmony_ci .name = "extra", 648c2ecf20Sopenharmony_ci .offset = SZ_4M + SZ_64M, 658c2ecf20Sopenharmony_ci .size = SZ_256M - (SZ_4M + SZ_64M), 668c2ecf20Sopenharmony_ci }, 678c2ecf20Sopenharmony_ci}; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_cistatic struct resource kurobox_pro_nand_resource = { 708c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 718c2ecf20Sopenharmony_ci .start = KUROBOX_PRO_NAND_BASE, 728c2ecf20Sopenharmony_ci .end = KUROBOX_PRO_NAND_BASE + KUROBOX_PRO_NAND_SIZE - 1, 738c2ecf20Sopenharmony_ci}; 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_cistatic struct orion_nand_data kurobox_pro_nand_data = { 768c2ecf20Sopenharmony_ci .parts = kurobox_pro_nand_parts, 778c2ecf20Sopenharmony_ci .nr_parts = ARRAY_SIZE(kurobox_pro_nand_parts), 788c2ecf20Sopenharmony_ci .cle = 0, 798c2ecf20Sopenharmony_ci .ale = 1, 808c2ecf20Sopenharmony_ci .width = 8, 818c2ecf20Sopenharmony_ci}; 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_cistatic struct platform_device kurobox_pro_nand_flash = { 848c2ecf20Sopenharmony_ci .name = "orion_nand", 858c2ecf20Sopenharmony_ci .id = -1, 868c2ecf20Sopenharmony_ci .dev = { 878c2ecf20Sopenharmony_ci .platform_data = &kurobox_pro_nand_data, 888c2ecf20Sopenharmony_ci }, 898c2ecf20Sopenharmony_ci .resource = &kurobox_pro_nand_resource, 908c2ecf20Sopenharmony_ci .num_resources = 1, 918c2ecf20Sopenharmony_ci}; 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci/***************************************************************************** 948c2ecf20Sopenharmony_ci * 256KB NOR Flash on BOOT Device 958c2ecf20Sopenharmony_ci ****************************************************************************/ 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_cistatic struct physmap_flash_data kurobox_pro_nor_flash_data = { 988c2ecf20Sopenharmony_ci .width = 1, 998c2ecf20Sopenharmony_ci}; 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_cistatic struct resource kurobox_pro_nor_flash_resource = { 1028c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 1038c2ecf20Sopenharmony_ci .start = KUROBOX_PRO_NOR_BOOT_BASE, 1048c2ecf20Sopenharmony_ci .end = KUROBOX_PRO_NOR_BOOT_BASE + KUROBOX_PRO_NOR_BOOT_SIZE - 1, 1058c2ecf20Sopenharmony_ci}; 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_cistatic struct platform_device kurobox_pro_nor_flash = { 1088c2ecf20Sopenharmony_ci .name = "physmap-flash", 1098c2ecf20Sopenharmony_ci .id = 0, 1108c2ecf20Sopenharmony_ci .dev = { 1118c2ecf20Sopenharmony_ci .platform_data = &kurobox_pro_nor_flash_data, 1128c2ecf20Sopenharmony_ci }, 1138c2ecf20Sopenharmony_ci .num_resources = 1, 1148c2ecf20Sopenharmony_ci .resource = &kurobox_pro_nor_flash_resource, 1158c2ecf20Sopenharmony_ci}; 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci/***************************************************************************** 1188c2ecf20Sopenharmony_ci * PCI 1198c2ecf20Sopenharmony_ci ****************************************************************************/ 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_cistatic int __init kurobox_pro_pci_map_irq(const struct pci_dev *dev, u8 slot, 1228c2ecf20Sopenharmony_ci u8 pin) 1238c2ecf20Sopenharmony_ci{ 1248c2ecf20Sopenharmony_ci int irq; 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci /* 1278c2ecf20Sopenharmony_ci * Check for devices with hard-wired IRQs. 1288c2ecf20Sopenharmony_ci */ 1298c2ecf20Sopenharmony_ci irq = orion5x_pci_map_irq(dev, slot, pin); 1308c2ecf20Sopenharmony_ci if (irq != -1) 1318c2ecf20Sopenharmony_ci return irq; 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci /* 1348c2ecf20Sopenharmony_ci * PCI isn't used on the Kuro 1358c2ecf20Sopenharmony_ci */ 1368c2ecf20Sopenharmony_ci return -1; 1378c2ecf20Sopenharmony_ci} 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_cistatic struct hw_pci kurobox_pro_pci __initdata = { 1408c2ecf20Sopenharmony_ci .nr_controllers = 2, 1418c2ecf20Sopenharmony_ci .setup = orion5x_pci_sys_setup, 1428c2ecf20Sopenharmony_ci .scan = orion5x_pci_sys_scan_bus, 1438c2ecf20Sopenharmony_ci .map_irq = kurobox_pro_pci_map_irq, 1448c2ecf20Sopenharmony_ci}; 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_cistatic int __init kurobox_pro_pci_init(void) 1478c2ecf20Sopenharmony_ci{ 1488c2ecf20Sopenharmony_ci if (machine_is_kurobox_pro()) { 1498c2ecf20Sopenharmony_ci orion5x_pci_disable(); 1508c2ecf20Sopenharmony_ci pci_common_init(&kurobox_pro_pci); 1518c2ecf20Sopenharmony_ci } 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ci return 0; 1548c2ecf20Sopenharmony_ci} 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_cisubsys_initcall(kurobox_pro_pci_init); 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_ci/***************************************************************************** 1598c2ecf20Sopenharmony_ci * Ethernet 1608c2ecf20Sopenharmony_ci ****************************************************************************/ 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_cistatic struct mv643xx_eth_platform_data kurobox_pro_eth_data = { 1638c2ecf20Sopenharmony_ci .phy_addr = MV643XX_ETH_PHY_ADDR(8), 1648c2ecf20Sopenharmony_ci}; 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ci/***************************************************************************** 1678c2ecf20Sopenharmony_ci * RTC 5C372a on I2C bus 1688c2ecf20Sopenharmony_ci ****************************************************************************/ 1698c2ecf20Sopenharmony_cistatic struct i2c_board_info __initdata kurobox_pro_i2c_rtc = { 1708c2ecf20Sopenharmony_ci I2C_BOARD_INFO("rs5c372a", 0x32), 1718c2ecf20Sopenharmony_ci}; 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_ci/***************************************************************************** 1748c2ecf20Sopenharmony_ci * SATA 1758c2ecf20Sopenharmony_ci ****************************************************************************/ 1768c2ecf20Sopenharmony_cistatic struct mv_sata_platform_data kurobox_pro_sata_data = { 1778c2ecf20Sopenharmony_ci .n_ports = 2, 1788c2ecf20Sopenharmony_ci}; 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ci/***************************************************************************** 1818c2ecf20Sopenharmony_ci * Kurobox Pro specific power off method via UART1-attached microcontroller 1828c2ecf20Sopenharmony_ci ****************************************************************************/ 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_ci#define UART1_REG(x) (UART1_VIRT_BASE + ((UART_##x) << 2)) 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_cistatic int kurobox_pro_miconread(unsigned char *buf, int count) 1878c2ecf20Sopenharmony_ci{ 1888c2ecf20Sopenharmony_ci int i; 1898c2ecf20Sopenharmony_ci int timeout; 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci for (i = 0; i < count; i++) { 1928c2ecf20Sopenharmony_ci timeout = 10; 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_ci while (!(readl(UART1_REG(LSR)) & UART_LSR_DR)) { 1958c2ecf20Sopenharmony_ci if (--timeout == 0) 1968c2ecf20Sopenharmony_ci break; 1978c2ecf20Sopenharmony_ci udelay(1000); 1988c2ecf20Sopenharmony_ci } 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci if (timeout == 0) 2018c2ecf20Sopenharmony_ci break; 2028c2ecf20Sopenharmony_ci buf[i] = readl(UART1_REG(RX)); 2038c2ecf20Sopenharmony_ci } 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_ci /* return read bytes */ 2068c2ecf20Sopenharmony_ci return i; 2078c2ecf20Sopenharmony_ci} 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_cistatic int kurobox_pro_miconwrite(const unsigned char *buf, int count) 2108c2ecf20Sopenharmony_ci{ 2118c2ecf20Sopenharmony_ci int i = 0; 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci while (count--) { 2148c2ecf20Sopenharmony_ci while (!(readl(UART1_REG(LSR)) & UART_LSR_THRE)) 2158c2ecf20Sopenharmony_ci barrier(); 2168c2ecf20Sopenharmony_ci writel(buf[i++], UART1_REG(TX)); 2178c2ecf20Sopenharmony_ci } 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_ci return 0; 2208c2ecf20Sopenharmony_ci} 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_cistatic int kurobox_pro_miconsend(const unsigned char *data, int count) 2238c2ecf20Sopenharmony_ci{ 2248c2ecf20Sopenharmony_ci int i; 2258c2ecf20Sopenharmony_ci unsigned char checksum = 0; 2268c2ecf20Sopenharmony_ci unsigned char recv_buf[40]; 2278c2ecf20Sopenharmony_ci unsigned char send_buf[40]; 2288c2ecf20Sopenharmony_ci unsigned char correct_ack[3]; 2298c2ecf20Sopenharmony_ci int retry = 2; 2308c2ecf20Sopenharmony_ci 2318c2ecf20Sopenharmony_ci /* Generate checksum */ 2328c2ecf20Sopenharmony_ci for (i = 0; i < count; i++) 2338c2ecf20Sopenharmony_ci checksum -= data[i]; 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_ci do { 2368c2ecf20Sopenharmony_ci /* Send data */ 2378c2ecf20Sopenharmony_ci kurobox_pro_miconwrite(data, count); 2388c2ecf20Sopenharmony_ci 2398c2ecf20Sopenharmony_ci /* send checksum */ 2408c2ecf20Sopenharmony_ci kurobox_pro_miconwrite(&checksum, 1); 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_ci if (kurobox_pro_miconread(recv_buf, sizeof(recv_buf)) <= 3) { 2438c2ecf20Sopenharmony_ci printk(KERN_ERR ">%s: receive failed.\n", __func__); 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci /* send preamble to clear the receive buffer */ 2468c2ecf20Sopenharmony_ci memset(&send_buf, 0xff, sizeof(send_buf)); 2478c2ecf20Sopenharmony_ci kurobox_pro_miconwrite(send_buf, sizeof(send_buf)); 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_ci /* make dummy reads */ 2508c2ecf20Sopenharmony_ci mdelay(100); 2518c2ecf20Sopenharmony_ci kurobox_pro_miconread(recv_buf, sizeof(recv_buf)); 2528c2ecf20Sopenharmony_ci } else { 2538c2ecf20Sopenharmony_ci /* Generate expected ack */ 2548c2ecf20Sopenharmony_ci correct_ack[0] = 0x01; 2558c2ecf20Sopenharmony_ci correct_ack[1] = data[1]; 2568c2ecf20Sopenharmony_ci correct_ack[2] = 0x00; 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci /* checksum Check */ 2598c2ecf20Sopenharmony_ci if ((recv_buf[0] + recv_buf[1] + recv_buf[2] + 2608c2ecf20Sopenharmony_ci recv_buf[3]) & 0xFF) { 2618c2ecf20Sopenharmony_ci printk(KERN_ERR ">%s: Checksum Error : " 2628c2ecf20Sopenharmony_ci "Received data[%02x, %02x, %02x, %02x]" 2638c2ecf20Sopenharmony_ci "\n", __func__, recv_buf[0], 2648c2ecf20Sopenharmony_ci recv_buf[1], recv_buf[2], recv_buf[3]); 2658c2ecf20Sopenharmony_ci } else { 2668c2ecf20Sopenharmony_ci /* Check Received Data */ 2678c2ecf20Sopenharmony_ci if (correct_ack[0] == recv_buf[0] && 2688c2ecf20Sopenharmony_ci correct_ack[1] == recv_buf[1] && 2698c2ecf20Sopenharmony_ci correct_ack[2] == recv_buf[2]) { 2708c2ecf20Sopenharmony_ci /* Interval for next command */ 2718c2ecf20Sopenharmony_ci mdelay(10); 2728c2ecf20Sopenharmony_ci 2738c2ecf20Sopenharmony_ci /* Receive ACK */ 2748c2ecf20Sopenharmony_ci return 0; 2758c2ecf20Sopenharmony_ci } 2768c2ecf20Sopenharmony_ci } 2778c2ecf20Sopenharmony_ci /* Received NAK or illegal Data */ 2788c2ecf20Sopenharmony_ci printk(KERN_ERR ">%s: Error : NAK or Illegal Data " 2798c2ecf20Sopenharmony_ci "Received\n", __func__); 2808c2ecf20Sopenharmony_ci } 2818c2ecf20Sopenharmony_ci } while (retry--); 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ci /* Interval for next command */ 2848c2ecf20Sopenharmony_ci mdelay(10); 2858c2ecf20Sopenharmony_ci 2868c2ecf20Sopenharmony_ci return -1; 2878c2ecf20Sopenharmony_ci} 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_cistatic void kurobox_pro_power_off(void) 2908c2ecf20Sopenharmony_ci{ 2918c2ecf20Sopenharmony_ci const unsigned char watchdogkill[] = {0x01, 0x35, 0x00}; 2928c2ecf20Sopenharmony_ci const unsigned char shutdownwait[] = {0x00, 0x0c}; 2938c2ecf20Sopenharmony_ci const unsigned char poweroff[] = {0x00, 0x06}; 2948c2ecf20Sopenharmony_ci /* 38400 baud divisor */ 2958c2ecf20Sopenharmony_ci const unsigned divisor = ((orion5x_tclk + (8 * 38400)) / (16 * 38400)); 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci pr_info("%s: triggering power-off...\n", __func__); 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_ci /* hijack uart1 and reset into sane state (38400,8n1,even parity) */ 3008c2ecf20Sopenharmony_ci writel(0x83, UART1_REG(LCR)); 3018c2ecf20Sopenharmony_ci writel(divisor & 0xff, UART1_REG(DLL)); 3028c2ecf20Sopenharmony_ci writel((divisor >> 8) & 0xff, UART1_REG(DLM)); 3038c2ecf20Sopenharmony_ci writel(0x1b, UART1_REG(LCR)); 3048c2ecf20Sopenharmony_ci writel(0x00, UART1_REG(IER)); 3058c2ecf20Sopenharmony_ci writel(0x07, UART1_REG(FCR)); 3068c2ecf20Sopenharmony_ci writel(0x00, UART1_REG(MCR)); 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_ci /* Send the commands to shutdown the Kurobox Pro */ 3098c2ecf20Sopenharmony_ci kurobox_pro_miconsend(watchdogkill, sizeof(watchdogkill)) ; 3108c2ecf20Sopenharmony_ci kurobox_pro_miconsend(shutdownwait, sizeof(shutdownwait)) ; 3118c2ecf20Sopenharmony_ci kurobox_pro_miconsend(poweroff, sizeof(poweroff)); 3128c2ecf20Sopenharmony_ci} 3138c2ecf20Sopenharmony_ci 3148c2ecf20Sopenharmony_ci/***************************************************************************** 3158c2ecf20Sopenharmony_ci * General Setup 3168c2ecf20Sopenharmony_ci ****************************************************************************/ 3178c2ecf20Sopenharmony_cistatic unsigned int kurobox_pro_mpp_modes[] __initdata = { 3188c2ecf20Sopenharmony_ci MPP0_UNUSED, 3198c2ecf20Sopenharmony_ci MPP1_UNUSED, 3208c2ecf20Sopenharmony_ci MPP2_GPIO, /* GPIO Micon */ 3218c2ecf20Sopenharmony_ci MPP3_GPIO, /* GPIO Rtc */ 3228c2ecf20Sopenharmony_ci MPP4_UNUSED, 3238c2ecf20Sopenharmony_ci MPP5_UNUSED, 3248c2ecf20Sopenharmony_ci MPP6_NAND, /* NAND Flash REn */ 3258c2ecf20Sopenharmony_ci MPP7_NAND, /* NAND Flash WEn */ 3268c2ecf20Sopenharmony_ci MPP8_UNUSED, 3278c2ecf20Sopenharmony_ci MPP9_UNUSED, 3288c2ecf20Sopenharmony_ci MPP10_UNUSED, 3298c2ecf20Sopenharmony_ci MPP11_UNUSED, 3308c2ecf20Sopenharmony_ci MPP12_SATA_LED, /* SATA 0 presence */ 3318c2ecf20Sopenharmony_ci MPP13_SATA_LED, /* SATA 1 presence */ 3328c2ecf20Sopenharmony_ci MPP14_SATA_LED, /* SATA 0 active */ 3338c2ecf20Sopenharmony_ci MPP15_SATA_LED, /* SATA 1 active */ 3348c2ecf20Sopenharmony_ci MPP16_UART, /* UART1 RXD */ 3358c2ecf20Sopenharmony_ci MPP17_UART, /* UART1 TXD */ 3368c2ecf20Sopenharmony_ci MPP18_UART, /* UART1 CTSn */ 3378c2ecf20Sopenharmony_ci MPP19_UART, /* UART1 RTSn */ 3388c2ecf20Sopenharmony_ci 0, 3398c2ecf20Sopenharmony_ci}; 3408c2ecf20Sopenharmony_ci 3418c2ecf20Sopenharmony_cistatic void __init kurobox_pro_init(void) 3428c2ecf20Sopenharmony_ci{ 3438c2ecf20Sopenharmony_ci /* 3448c2ecf20Sopenharmony_ci * Setup basic Orion functions. Need to be called early. 3458c2ecf20Sopenharmony_ci */ 3468c2ecf20Sopenharmony_ci orion5x_init(); 3478c2ecf20Sopenharmony_ci 3488c2ecf20Sopenharmony_ci orion5x_mpp_conf(kurobox_pro_mpp_modes); 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_ci /* 3518c2ecf20Sopenharmony_ci * Configure peripherals. 3528c2ecf20Sopenharmony_ci */ 3538c2ecf20Sopenharmony_ci orion5x_ehci0_init(); 3548c2ecf20Sopenharmony_ci orion5x_ehci1_init(); 3558c2ecf20Sopenharmony_ci orion5x_eth_init(&kurobox_pro_eth_data); 3568c2ecf20Sopenharmony_ci orion5x_i2c_init(); 3578c2ecf20Sopenharmony_ci orion5x_sata_init(&kurobox_pro_sata_data); 3588c2ecf20Sopenharmony_ci orion5x_uart0_init(); 3598c2ecf20Sopenharmony_ci orion5x_uart1_init(); 3608c2ecf20Sopenharmony_ci orion5x_xor_init(); 3618c2ecf20Sopenharmony_ci 3628c2ecf20Sopenharmony_ci mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET, 3638c2ecf20Sopenharmony_ci ORION_MBUS_DEVBUS_BOOT_ATTR, 3648c2ecf20Sopenharmony_ci KUROBOX_PRO_NOR_BOOT_BASE, 3658c2ecf20Sopenharmony_ci KUROBOX_PRO_NOR_BOOT_SIZE); 3668c2ecf20Sopenharmony_ci platform_device_register(&kurobox_pro_nor_flash); 3678c2ecf20Sopenharmony_ci 3688c2ecf20Sopenharmony_ci if (machine_is_kurobox_pro()) { 3698c2ecf20Sopenharmony_ci mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_TARGET(0), 3708c2ecf20Sopenharmony_ci ORION_MBUS_DEVBUS_ATTR(0), 3718c2ecf20Sopenharmony_ci KUROBOX_PRO_NAND_BASE, 3728c2ecf20Sopenharmony_ci KUROBOX_PRO_NAND_SIZE); 3738c2ecf20Sopenharmony_ci platform_device_register(&kurobox_pro_nand_flash); 3748c2ecf20Sopenharmony_ci } 3758c2ecf20Sopenharmony_ci 3768c2ecf20Sopenharmony_ci i2c_register_board_info(0, &kurobox_pro_i2c_rtc, 1); 3778c2ecf20Sopenharmony_ci 3788c2ecf20Sopenharmony_ci /* register Kurobox Pro specific power-off method */ 3798c2ecf20Sopenharmony_ci pm_power_off = kurobox_pro_power_off; 3808c2ecf20Sopenharmony_ci} 3818c2ecf20Sopenharmony_ci 3828c2ecf20Sopenharmony_ci#ifdef CONFIG_MACH_KUROBOX_PRO 3838c2ecf20Sopenharmony_ciMACHINE_START(KUROBOX_PRO, "Buffalo/Revogear Kurobox Pro") 3848c2ecf20Sopenharmony_ci /* Maintainer: Ronen Shitrit <rshitrit@marvell.com> */ 3858c2ecf20Sopenharmony_ci .atag_offset = 0x100, 3868c2ecf20Sopenharmony_ci .nr_irqs = ORION5X_NR_IRQS, 3878c2ecf20Sopenharmony_ci .init_machine = kurobox_pro_init, 3888c2ecf20Sopenharmony_ci .map_io = orion5x_map_io, 3898c2ecf20Sopenharmony_ci .init_early = orion5x_init_early, 3908c2ecf20Sopenharmony_ci .init_irq = orion5x_init_irq, 3918c2ecf20Sopenharmony_ci .init_time = orion5x_timer_init, 3928c2ecf20Sopenharmony_ci .fixup = tag_fixup_mem32, 3938c2ecf20Sopenharmony_ci .restart = orion5x_restart, 3948c2ecf20Sopenharmony_ciMACHINE_END 3958c2ecf20Sopenharmony_ci#endif 3968c2ecf20Sopenharmony_ci 3978c2ecf20Sopenharmony_ci#ifdef CONFIG_MACH_LINKSTATION_PRO 3988c2ecf20Sopenharmony_ciMACHINE_START(LINKSTATION_PRO, "Buffalo Linkstation Pro/Live") 3998c2ecf20Sopenharmony_ci /* Maintainer: Byron Bradley <byron.bbradley@gmail.com> */ 4008c2ecf20Sopenharmony_ci .atag_offset = 0x100, 4018c2ecf20Sopenharmony_ci .nr_irqs = ORION5X_NR_IRQS, 4028c2ecf20Sopenharmony_ci .init_machine = kurobox_pro_init, 4038c2ecf20Sopenharmony_ci .map_io = orion5x_map_io, 4048c2ecf20Sopenharmony_ci .init_early = orion5x_init_early, 4058c2ecf20Sopenharmony_ci .init_irq = orion5x_init_irq, 4068c2ecf20Sopenharmony_ci .init_time = orion5x_timer_init, 4078c2ecf20Sopenharmony_ci .fixup = tag_fixup_mem32, 4088c2ecf20Sopenharmony_ci .restart = orion5x_restart, 4098c2ecf20Sopenharmony_ciMACHINE_END 4108c2ecf20Sopenharmony_ci#endif 411