162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * arch/arm/mach-orion5x/kurobox_pro-setup.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Maintainer: Ronen Shitrit <rshitrit@marvell.com> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#include <linux/gpio.h> 862306a36Sopenharmony_ci#include <linux/kernel.h> 962306a36Sopenharmony_ci#include <linux/init.h> 1062306a36Sopenharmony_ci#include <linux/platform_device.h> 1162306a36Sopenharmony_ci#include <linux/pci.h> 1262306a36Sopenharmony_ci#include <linux/irq.h> 1362306a36Sopenharmony_ci#include <linux/delay.h> 1462306a36Sopenharmony_ci#include <linux/mtd/physmap.h> 1562306a36Sopenharmony_ci#include <linux/mtd/rawnand.h> 1662306a36Sopenharmony_ci#include <linux/mv643xx_eth.h> 1762306a36Sopenharmony_ci#include <linux/i2c.h> 1862306a36Sopenharmony_ci#include <linux/serial_reg.h> 1962306a36Sopenharmony_ci#include <linux/ata_platform.h> 2062306a36Sopenharmony_ci#include <asm/mach-types.h> 2162306a36Sopenharmony_ci#include <asm/mach/arch.h> 2262306a36Sopenharmony_ci#include <asm/mach/pci.h> 2362306a36Sopenharmony_ci#include <linux/platform_data/mtd-orion_nand.h> 2462306a36Sopenharmony_ci#include "common.h" 2562306a36Sopenharmony_ci#include "mpp.h" 2662306a36Sopenharmony_ci#include "orion5x.h" 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/***************************************************************************** 2962306a36Sopenharmony_ci * KUROBOX-PRO Info 3062306a36Sopenharmony_ci ****************************************************************************/ 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/* 3362306a36Sopenharmony_ci * 256K NOR flash Device bus boot chip select 3462306a36Sopenharmony_ci */ 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define KUROBOX_PRO_NOR_BOOT_BASE 0xf4000000 3762306a36Sopenharmony_ci#define KUROBOX_PRO_NOR_BOOT_SIZE SZ_256K 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* 4062306a36Sopenharmony_ci * 256M NAND flash on Device bus chip select 1 4162306a36Sopenharmony_ci */ 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#define KUROBOX_PRO_NAND_BASE 0xfc000000 4462306a36Sopenharmony_ci#define KUROBOX_PRO_NAND_SIZE SZ_2M 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci/***************************************************************************** 4762306a36Sopenharmony_ci * 256MB NAND Flash on Device bus CS0 4862306a36Sopenharmony_ci ****************************************************************************/ 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_cistatic struct mtd_partition kurobox_pro_nand_parts[] = { 5162306a36Sopenharmony_ci { 5262306a36Sopenharmony_ci .name = "uImage", 5362306a36Sopenharmony_ci .offset = 0, 5462306a36Sopenharmony_ci .size = SZ_4M, 5562306a36Sopenharmony_ci }, { 5662306a36Sopenharmony_ci .name = "rootfs", 5762306a36Sopenharmony_ci .offset = SZ_4M, 5862306a36Sopenharmony_ci .size = SZ_64M, 5962306a36Sopenharmony_ci }, { 6062306a36Sopenharmony_ci .name = "extra", 6162306a36Sopenharmony_ci .offset = SZ_4M + SZ_64M, 6262306a36Sopenharmony_ci .size = SZ_256M - (SZ_4M + SZ_64M), 6362306a36Sopenharmony_ci }, 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistatic struct resource kurobox_pro_nand_resource = { 6762306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 6862306a36Sopenharmony_ci .start = KUROBOX_PRO_NAND_BASE, 6962306a36Sopenharmony_ci .end = KUROBOX_PRO_NAND_BASE + KUROBOX_PRO_NAND_SIZE - 1, 7062306a36Sopenharmony_ci}; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_cistatic struct orion_nand_data kurobox_pro_nand_data = { 7362306a36Sopenharmony_ci .parts = kurobox_pro_nand_parts, 7462306a36Sopenharmony_ci .nr_parts = ARRAY_SIZE(kurobox_pro_nand_parts), 7562306a36Sopenharmony_ci .cle = 0, 7662306a36Sopenharmony_ci .ale = 1, 7762306a36Sopenharmony_ci .width = 8, 7862306a36Sopenharmony_ci}; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cistatic struct platform_device kurobox_pro_nand_flash = { 8162306a36Sopenharmony_ci .name = "orion_nand", 8262306a36Sopenharmony_ci .id = -1, 8362306a36Sopenharmony_ci .dev = { 8462306a36Sopenharmony_ci .platform_data = &kurobox_pro_nand_data, 8562306a36Sopenharmony_ci }, 8662306a36Sopenharmony_ci .resource = &kurobox_pro_nand_resource, 8762306a36Sopenharmony_ci .num_resources = 1, 8862306a36Sopenharmony_ci}; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci/***************************************************************************** 9162306a36Sopenharmony_ci * 256KB NOR Flash on BOOT Device 9262306a36Sopenharmony_ci ****************************************************************************/ 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cistatic struct physmap_flash_data kurobox_pro_nor_flash_data = { 9562306a36Sopenharmony_ci .width = 1, 9662306a36Sopenharmony_ci}; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_cistatic struct resource kurobox_pro_nor_flash_resource = { 9962306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 10062306a36Sopenharmony_ci .start = KUROBOX_PRO_NOR_BOOT_BASE, 10162306a36Sopenharmony_ci .end = KUROBOX_PRO_NOR_BOOT_BASE + KUROBOX_PRO_NOR_BOOT_SIZE - 1, 10262306a36Sopenharmony_ci}; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cistatic struct platform_device kurobox_pro_nor_flash = { 10562306a36Sopenharmony_ci .name = "physmap-flash", 10662306a36Sopenharmony_ci .id = 0, 10762306a36Sopenharmony_ci .dev = { 10862306a36Sopenharmony_ci .platform_data = &kurobox_pro_nor_flash_data, 10962306a36Sopenharmony_ci }, 11062306a36Sopenharmony_ci .num_resources = 1, 11162306a36Sopenharmony_ci .resource = &kurobox_pro_nor_flash_resource, 11262306a36Sopenharmony_ci}; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci/***************************************************************************** 11562306a36Sopenharmony_ci * PCI 11662306a36Sopenharmony_ci ****************************************************************************/ 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cistatic int __init kurobox_pro_pci_map_irq(const struct pci_dev *dev, u8 slot, 11962306a36Sopenharmony_ci u8 pin) 12062306a36Sopenharmony_ci{ 12162306a36Sopenharmony_ci int irq; 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci /* 12462306a36Sopenharmony_ci * Check for devices with hard-wired IRQs. 12562306a36Sopenharmony_ci */ 12662306a36Sopenharmony_ci irq = orion5x_pci_map_irq(dev, slot, pin); 12762306a36Sopenharmony_ci if (irq != -1) 12862306a36Sopenharmony_ci return irq; 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci /* 13162306a36Sopenharmony_ci * PCI isn't used on the Kuro 13262306a36Sopenharmony_ci */ 13362306a36Sopenharmony_ci return -1; 13462306a36Sopenharmony_ci} 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_cistatic struct hw_pci kurobox_pro_pci __initdata = { 13762306a36Sopenharmony_ci .nr_controllers = 2, 13862306a36Sopenharmony_ci .setup = orion5x_pci_sys_setup, 13962306a36Sopenharmony_ci .scan = orion5x_pci_sys_scan_bus, 14062306a36Sopenharmony_ci .map_irq = kurobox_pro_pci_map_irq, 14162306a36Sopenharmony_ci}; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_cistatic int __init kurobox_pro_pci_init(void) 14462306a36Sopenharmony_ci{ 14562306a36Sopenharmony_ci if (machine_is_kurobox_pro()) { 14662306a36Sopenharmony_ci orion5x_pci_disable(); 14762306a36Sopenharmony_ci pci_common_init(&kurobox_pro_pci); 14862306a36Sopenharmony_ci } 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci return 0; 15162306a36Sopenharmony_ci} 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_cisubsys_initcall(kurobox_pro_pci_init); 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci/***************************************************************************** 15662306a36Sopenharmony_ci * Ethernet 15762306a36Sopenharmony_ci ****************************************************************************/ 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cistatic struct mv643xx_eth_platform_data kurobox_pro_eth_data = { 16062306a36Sopenharmony_ci .phy_addr = MV643XX_ETH_PHY_ADDR(8), 16162306a36Sopenharmony_ci}; 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci/***************************************************************************** 16462306a36Sopenharmony_ci * RTC 5C372a on I2C bus 16562306a36Sopenharmony_ci ****************************************************************************/ 16662306a36Sopenharmony_cistatic struct i2c_board_info __initdata kurobox_pro_i2c_rtc = { 16762306a36Sopenharmony_ci I2C_BOARD_INFO("rs5c372a", 0x32), 16862306a36Sopenharmony_ci}; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci/***************************************************************************** 17162306a36Sopenharmony_ci * SATA 17262306a36Sopenharmony_ci ****************************************************************************/ 17362306a36Sopenharmony_cistatic struct mv_sata_platform_data kurobox_pro_sata_data = { 17462306a36Sopenharmony_ci .n_ports = 2, 17562306a36Sopenharmony_ci}; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci/***************************************************************************** 17862306a36Sopenharmony_ci * Kurobox Pro specific power off method via UART1-attached microcontroller 17962306a36Sopenharmony_ci ****************************************************************************/ 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci#define UART1_REG(x) (UART1_VIRT_BASE + ((UART_##x) << 2)) 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_cistatic int kurobox_pro_miconread(unsigned char *buf, int count) 18462306a36Sopenharmony_ci{ 18562306a36Sopenharmony_ci int i; 18662306a36Sopenharmony_ci int timeout; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci for (i = 0; i < count; i++) { 18962306a36Sopenharmony_ci timeout = 10; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci while (!(readl(UART1_REG(LSR)) & UART_LSR_DR)) { 19262306a36Sopenharmony_ci if (--timeout == 0) 19362306a36Sopenharmony_ci break; 19462306a36Sopenharmony_ci udelay(1000); 19562306a36Sopenharmony_ci } 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci if (timeout == 0) 19862306a36Sopenharmony_ci break; 19962306a36Sopenharmony_ci buf[i] = readl(UART1_REG(RX)); 20062306a36Sopenharmony_ci } 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci /* return read bytes */ 20362306a36Sopenharmony_ci return i; 20462306a36Sopenharmony_ci} 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_cistatic int kurobox_pro_miconwrite(const unsigned char *buf, int count) 20762306a36Sopenharmony_ci{ 20862306a36Sopenharmony_ci int i = 0; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci while (count--) { 21162306a36Sopenharmony_ci while (!(readl(UART1_REG(LSR)) & UART_LSR_THRE)) 21262306a36Sopenharmony_ci barrier(); 21362306a36Sopenharmony_ci writel(buf[i++], UART1_REG(TX)); 21462306a36Sopenharmony_ci } 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci return 0; 21762306a36Sopenharmony_ci} 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_cistatic int kurobox_pro_miconsend(const unsigned char *data, int count) 22062306a36Sopenharmony_ci{ 22162306a36Sopenharmony_ci int i; 22262306a36Sopenharmony_ci unsigned char checksum = 0; 22362306a36Sopenharmony_ci unsigned char recv_buf[40]; 22462306a36Sopenharmony_ci unsigned char send_buf[40]; 22562306a36Sopenharmony_ci unsigned char correct_ack[3]; 22662306a36Sopenharmony_ci int retry = 2; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci /* Generate checksum */ 22962306a36Sopenharmony_ci for (i = 0; i < count; i++) 23062306a36Sopenharmony_ci checksum -= data[i]; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci do { 23362306a36Sopenharmony_ci /* Send data */ 23462306a36Sopenharmony_ci kurobox_pro_miconwrite(data, count); 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci /* send checksum */ 23762306a36Sopenharmony_ci kurobox_pro_miconwrite(&checksum, 1); 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci if (kurobox_pro_miconread(recv_buf, sizeof(recv_buf)) <= 3) { 24062306a36Sopenharmony_ci printk(KERN_ERR ">%s: receive failed.\n", __func__); 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci /* send preamble to clear the receive buffer */ 24362306a36Sopenharmony_ci memset(&send_buf, 0xff, sizeof(send_buf)); 24462306a36Sopenharmony_ci kurobox_pro_miconwrite(send_buf, sizeof(send_buf)); 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci /* make dummy reads */ 24762306a36Sopenharmony_ci mdelay(100); 24862306a36Sopenharmony_ci kurobox_pro_miconread(recv_buf, sizeof(recv_buf)); 24962306a36Sopenharmony_ci } else { 25062306a36Sopenharmony_ci /* Generate expected ack */ 25162306a36Sopenharmony_ci correct_ack[0] = 0x01; 25262306a36Sopenharmony_ci correct_ack[1] = data[1]; 25362306a36Sopenharmony_ci correct_ack[2] = 0x00; 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci /* checksum Check */ 25662306a36Sopenharmony_ci if ((recv_buf[0] + recv_buf[1] + recv_buf[2] + 25762306a36Sopenharmony_ci recv_buf[3]) & 0xFF) { 25862306a36Sopenharmony_ci printk(KERN_ERR ">%s: Checksum Error : " 25962306a36Sopenharmony_ci "Received data[%02x, %02x, %02x, %02x]" 26062306a36Sopenharmony_ci "\n", __func__, recv_buf[0], 26162306a36Sopenharmony_ci recv_buf[1], recv_buf[2], recv_buf[3]); 26262306a36Sopenharmony_ci } else { 26362306a36Sopenharmony_ci /* Check Received Data */ 26462306a36Sopenharmony_ci if (correct_ack[0] == recv_buf[0] && 26562306a36Sopenharmony_ci correct_ack[1] == recv_buf[1] && 26662306a36Sopenharmony_ci correct_ack[2] == recv_buf[2]) { 26762306a36Sopenharmony_ci /* Interval for next command */ 26862306a36Sopenharmony_ci mdelay(10); 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci /* Receive ACK */ 27162306a36Sopenharmony_ci return 0; 27262306a36Sopenharmony_ci } 27362306a36Sopenharmony_ci } 27462306a36Sopenharmony_ci /* Received NAK or illegal Data */ 27562306a36Sopenharmony_ci printk(KERN_ERR ">%s: Error : NAK or Illegal Data " 27662306a36Sopenharmony_ci "Received\n", __func__); 27762306a36Sopenharmony_ci } 27862306a36Sopenharmony_ci } while (retry--); 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci /* Interval for next command */ 28162306a36Sopenharmony_ci mdelay(10); 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci return -1; 28462306a36Sopenharmony_ci} 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_cistatic void kurobox_pro_power_off(void) 28762306a36Sopenharmony_ci{ 28862306a36Sopenharmony_ci const unsigned char watchdogkill[] = {0x01, 0x35, 0x00}; 28962306a36Sopenharmony_ci const unsigned char shutdownwait[] = {0x00, 0x0c}; 29062306a36Sopenharmony_ci const unsigned char poweroff[] = {0x00, 0x06}; 29162306a36Sopenharmony_ci /* 38400 baud divisor */ 29262306a36Sopenharmony_ci const unsigned divisor = ((orion5x_tclk + (8 * 38400)) / (16 * 38400)); 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci pr_info("%s: triggering power-off...\n", __func__); 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci /* hijack uart1 and reset into sane state (38400,8n1,even parity) */ 29762306a36Sopenharmony_ci writel(0x83, UART1_REG(LCR)); 29862306a36Sopenharmony_ci writel(divisor & 0xff, UART1_REG(DLL)); 29962306a36Sopenharmony_ci writel((divisor >> 8) & 0xff, UART1_REG(DLM)); 30062306a36Sopenharmony_ci writel(0x1b, UART1_REG(LCR)); 30162306a36Sopenharmony_ci writel(0x00, UART1_REG(IER)); 30262306a36Sopenharmony_ci writel(0x07, UART1_REG(FCR)); 30362306a36Sopenharmony_ci writel(0x00, UART1_REG(MCR)); 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci /* Send the commands to shutdown the Kurobox Pro */ 30662306a36Sopenharmony_ci kurobox_pro_miconsend(watchdogkill, sizeof(watchdogkill)) ; 30762306a36Sopenharmony_ci kurobox_pro_miconsend(shutdownwait, sizeof(shutdownwait)) ; 30862306a36Sopenharmony_ci kurobox_pro_miconsend(poweroff, sizeof(poweroff)); 30962306a36Sopenharmony_ci} 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci/***************************************************************************** 31262306a36Sopenharmony_ci * General Setup 31362306a36Sopenharmony_ci ****************************************************************************/ 31462306a36Sopenharmony_cistatic unsigned int kurobox_pro_mpp_modes[] __initdata = { 31562306a36Sopenharmony_ci MPP0_UNUSED, 31662306a36Sopenharmony_ci MPP1_UNUSED, 31762306a36Sopenharmony_ci MPP2_GPIO, /* GPIO Micon */ 31862306a36Sopenharmony_ci MPP3_GPIO, /* GPIO Rtc */ 31962306a36Sopenharmony_ci MPP4_UNUSED, 32062306a36Sopenharmony_ci MPP5_UNUSED, 32162306a36Sopenharmony_ci MPP6_NAND, /* NAND Flash REn */ 32262306a36Sopenharmony_ci MPP7_NAND, /* NAND Flash WEn */ 32362306a36Sopenharmony_ci MPP8_UNUSED, 32462306a36Sopenharmony_ci MPP9_UNUSED, 32562306a36Sopenharmony_ci MPP10_UNUSED, 32662306a36Sopenharmony_ci MPP11_UNUSED, 32762306a36Sopenharmony_ci MPP12_SATA_LED, /* SATA 0 presence */ 32862306a36Sopenharmony_ci MPP13_SATA_LED, /* SATA 1 presence */ 32962306a36Sopenharmony_ci MPP14_SATA_LED, /* SATA 0 active */ 33062306a36Sopenharmony_ci MPP15_SATA_LED, /* SATA 1 active */ 33162306a36Sopenharmony_ci MPP16_UART, /* UART1 RXD */ 33262306a36Sopenharmony_ci MPP17_UART, /* UART1 TXD */ 33362306a36Sopenharmony_ci MPP18_UART, /* UART1 CTSn */ 33462306a36Sopenharmony_ci MPP19_UART, /* UART1 RTSn */ 33562306a36Sopenharmony_ci 0, 33662306a36Sopenharmony_ci}; 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_cistatic void __init kurobox_pro_init(void) 33962306a36Sopenharmony_ci{ 34062306a36Sopenharmony_ci /* 34162306a36Sopenharmony_ci * Setup basic Orion functions. Need to be called early. 34262306a36Sopenharmony_ci */ 34362306a36Sopenharmony_ci orion5x_init(); 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci orion5x_mpp_conf(kurobox_pro_mpp_modes); 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci /* 34862306a36Sopenharmony_ci * Configure peripherals. 34962306a36Sopenharmony_ci */ 35062306a36Sopenharmony_ci orion5x_ehci0_init(); 35162306a36Sopenharmony_ci orion5x_ehci1_init(); 35262306a36Sopenharmony_ci orion5x_eth_init(&kurobox_pro_eth_data); 35362306a36Sopenharmony_ci orion5x_i2c_init(); 35462306a36Sopenharmony_ci orion5x_sata_init(&kurobox_pro_sata_data); 35562306a36Sopenharmony_ci orion5x_uart0_init(); 35662306a36Sopenharmony_ci orion5x_uart1_init(); 35762306a36Sopenharmony_ci orion5x_xor_init(); 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET, 36062306a36Sopenharmony_ci ORION_MBUS_DEVBUS_BOOT_ATTR, 36162306a36Sopenharmony_ci KUROBOX_PRO_NOR_BOOT_BASE, 36262306a36Sopenharmony_ci KUROBOX_PRO_NOR_BOOT_SIZE); 36362306a36Sopenharmony_ci platform_device_register(&kurobox_pro_nor_flash); 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci if (machine_is_kurobox_pro()) { 36662306a36Sopenharmony_ci mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_TARGET(0), 36762306a36Sopenharmony_ci ORION_MBUS_DEVBUS_ATTR(0), 36862306a36Sopenharmony_ci KUROBOX_PRO_NAND_BASE, 36962306a36Sopenharmony_ci KUROBOX_PRO_NAND_SIZE); 37062306a36Sopenharmony_ci platform_device_register(&kurobox_pro_nand_flash); 37162306a36Sopenharmony_ci } 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci i2c_register_board_info(0, &kurobox_pro_i2c_rtc, 1); 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci /* register Kurobox Pro specific power-off method */ 37662306a36Sopenharmony_ci pm_power_off = kurobox_pro_power_off; 37762306a36Sopenharmony_ci} 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ci#ifdef CONFIG_MACH_KUROBOX_PRO 38062306a36Sopenharmony_ciMACHINE_START(KUROBOX_PRO, "Buffalo/Revogear Kurobox Pro") 38162306a36Sopenharmony_ci /* Maintainer: Ronen Shitrit <rshitrit@marvell.com> */ 38262306a36Sopenharmony_ci .atag_offset = 0x100, 38362306a36Sopenharmony_ci .nr_irqs = ORION5X_NR_IRQS, 38462306a36Sopenharmony_ci .init_machine = kurobox_pro_init, 38562306a36Sopenharmony_ci .map_io = orion5x_map_io, 38662306a36Sopenharmony_ci .init_early = orion5x_init_early, 38762306a36Sopenharmony_ci .init_irq = orion5x_init_irq, 38862306a36Sopenharmony_ci .init_time = orion5x_timer_init, 38962306a36Sopenharmony_ci .fixup = tag_fixup_mem32, 39062306a36Sopenharmony_ci .restart = orion5x_restart, 39162306a36Sopenharmony_ciMACHINE_END 39262306a36Sopenharmony_ci#endif 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci#ifdef CONFIG_MACH_LINKSTATION_PRO 39562306a36Sopenharmony_ciMACHINE_START(LINKSTATION_PRO, "Buffalo Linkstation Pro/Live") 39662306a36Sopenharmony_ci /* Maintainer: Byron Bradley <byron.bbradley@gmail.com> */ 39762306a36Sopenharmony_ci .atag_offset = 0x100, 39862306a36Sopenharmony_ci .nr_irqs = ORION5X_NR_IRQS, 39962306a36Sopenharmony_ci .init_machine = kurobox_pro_init, 40062306a36Sopenharmony_ci .map_io = orion5x_map_io, 40162306a36Sopenharmony_ci .init_early = orion5x_init_early, 40262306a36Sopenharmony_ci .init_irq = orion5x_init_irq, 40362306a36Sopenharmony_ci .init_time = orion5x_timer_init, 40462306a36Sopenharmony_ci .fixup = tag_fixup_mem32, 40562306a36Sopenharmony_ci .restart = orion5x_restart, 40662306a36Sopenharmony_ciMACHINE_END 40762306a36Sopenharmony_ci#endif 408