18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Buffalo Terastation Pro II/Live Board Setup 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Maintainer: Sylver Bruneau <sylver.bruneau@googlemail.com> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci#include <linux/gpio.h> 88c2ecf20Sopenharmony_ci#include <linux/kernel.h> 98c2ecf20Sopenharmony_ci#include <linux/init.h> 108c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 118c2ecf20Sopenharmony_ci#include <linux/pci.h> 128c2ecf20Sopenharmony_ci#include <linux/irq.h> 138c2ecf20Sopenharmony_ci#include <linux/delay.h> 148c2ecf20Sopenharmony_ci#include <linux/mtd/physmap.h> 158c2ecf20Sopenharmony_ci#include <linux/mv643xx_eth.h> 168c2ecf20Sopenharmony_ci#include <linux/i2c.h> 178c2ecf20Sopenharmony_ci#include <linux/serial_reg.h> 188c2ecf20Sopenharmony_ci#include <asm/mach-types.h> 198c2ecf20Sopenharmony_ci#include <asm/mach/arch.h> 208c2ecf20Sopenharmony_ci#include <asm/mach/pci.h> 218c2ecf20Sopenharmony_ci#include "common.h" 228c2ecf20Sopenharmony_ci#include "mpp.h" 238c2ecf20Sopenharmony_ci#include "orion5x.h" 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci/***************************************************************************** 268c2ecf20Sopenharmony_ci * Terastation Pro 2/Live Info 278c2ecf20Sopenharmony_ci ****************************************************************************/ 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci/* 308c2ecf20Sopenharmony_ci * Terastation Pro 2 hardware : 318c2ecf20Sopenharmony_ci * - Marvell 88F5281-D0 328c2ecf20Sopenharmony_ci * - Marvell 88SX6042 SATA controller (PCI) 338c2ecf20Sopenharmony_ci * - Marvell 88E1118 Gigabit Ethernet PHY 348c2ecf20Sopenharmony_ci * - 256KB NOR flash 358c2ecf20Sopenharmony_ci * - 128MB of DDR RAM 368c2ecf20Sopenharmony_ci * - PCIe port (not equipped) 378c2ecf20Sopenharmony_ci */ 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci/* 408c2ecf20Sopenharmony_ci * 256K NOR flash Device bus boot chip select 418c2ecf20Sopenharmony_ci */ 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci#define TSP2_NOR_BOOT_BASE 0xf4000000 448c2ecf20Sopenharmony_ci#define TSP2_NOR_BOOT_SIZE SZ_256K 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci/***************************************************************************** 478c2ecf20Sopenharmony_ci * 256KB NOR Flash on BOOT Device 488c2ecf20Sopenharmony_ci ****************************************************************************/ 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_cistatic struct physmap_flash_data tsp2_nor_flash_data = { 518c2ecf20Sopenharmony_ci .width = 1, 528c2ecf20Sopenharmony_ci}; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cistatic struct resource tsp2_nor_flash_resource = { 558c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 568c2ecf20Sopenharmony_ci .start = TSP2_NOR_BOOT_BASE, 578c2ecf20Sopenharmony_ci .end = TSP2_NOR_BOOT_BASE + TSP2_NOR_BOOT_SIZE - 1, 588c2ecf20Sopenharmony_ci}; 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_cistatic struct platform_device tsp2_nor_flash = { 618c2ecf20Sopenharmony_ci .name = "physmap-flash", 628c2ecf20Sopenharmony_ci .id = 0, 638c2ecf20Sopenharmony_ci .dev = { 648c2ecf20Sopenharmony_ci .platform_data = &tsp2_nor_flash_data, 658c2ecf20Sopenharmony_ci }, 668c2ecf20Sopenharmony_ci .num_resources = 1, 678c2ecf20Sopenharmony_ci .resource = &tsp2_nor_flash_resource, 688c2ecf20Sopenharmony_ci}; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci/***************************************************************************** 718c2ecf20Sopenharmony_ci * PCI 728c2ecf20Sopenharmony_ci ****************************************************************************/ 738c2ecf20Sopenharmony_ci#define TSP2_PCI_SLOT0_OFFS 7 748c2ecf20Sopenharmony_ci#define TSP2_PCI_SLOT0_IRQ_PIN 11 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_cistatic void __init tsp2_pci_preinit(void) 778c2ecf20Sopenharmony_ci{ 788c2ecf20Sopenharmony_ci int pin; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci /* 818c2ecf20Sopenharmony_ci * Configure PCI GPIO IRQ pins 828c2ecf20Sopenharmony_ci */ 838c2ecf20Sopenharmony_ci pin = TSP2_PCI_SLOT0_IRQ_PIN; 848c2ecf20Sopenharmony_ci if (gpio_request(pin, "PCI Int1") == 0) { 858c2ecf20Sopenharmony_ci if (gpio_direction_input(pin) == 0) { 868c2ecf20Sopenharmony_ci irq_set_irq_type(gpio_to_irq(pin), IRQ_TYPE_LEVEL_LOW); 878c2ecf20Sopenharmony_ci } else { 888c2ecf20Sopenharmony_ci printk(KERN_ERR "tsp2_pci_preinit failed " 898c2ecf20Sopenharmony_ci "to set_irq_type pin %d\n", pin); 908c2ecf20Sopenharmony_ci gpio_free(pin); 918c2ecf20Sopenharmony_ci } 928c2ecf20Sopenharmony_ci } else { 938c2ecf20Sopenharmony_ci printk(KERN_ERR "tsp2_pci_preinit failed to " 948c2ecf20Sopenharmony_ci "gpio_request %d\n", pin); 958c2ecf20Sopenharmony_ci } 968c2ecf20Sopenharmony_ci} 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_cistatic int __init tsp2_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) 998c2ecf20Sopenharmony_ci{ 1008c2ecf20Sopenharmony_ci int irq; 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci /* 1038c2ecf20Sopenharmony_ci * Check for devices with hard-wired IRQs. 1048c2ecf20Sopenharmony_ci */ 1058c2ecf20Sopenharmony_ci irq = orion5x_pci_map_irq(dev, slot, pin); 1068c2ecf20Sopenharmony_ci if (irq != -1) 1078c2ecf20Sopenharmony_ci return irq; 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci /* 1108c2ecf20Sopenharmony_ci * PCI IRQs are connected via GPIOs. 1118c2ecf20Sopenharmony_ci */ 1128c2ecf20Sopenharmony_ci if (slot == TSP2_PCI_SLOT0_OFFS) 1138c2ecf20Sopenharmony_ci return gpio_to_irq(TSP2_PCI_SLOT0_IRQ_PIN); 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci return -1; 1168c2ecf20Sopenharmony_ci} 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_cistatic struct hw_pci tsp2_pci __initdata = { 1198c2ecf20Sopenharmony_ci .nr_controllers = 2, 1208c2ecf20Sopenharmony_ci .preinit = tsp2_pci_preinit, 1218c2ecf20Sopenharmony_ci .setup = orion5x_pci_sys_setup, 1228c2ecf20Sopenharmony_ci .scan = orion5x_pci_sys_scan_bus, 1238c2ecf20Sopenharmony_ci .map_irq = tsp2_pci_map_irq, 1248c2ecf20Sopenharmony_ci}; 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_cistatic int __init tsp2_pci_init(void) 1278c2ecf20Sopenharmony_ci{ 1288c2ecf20Sopenharmony_ci if (machine_is_terastation_pro2()) 1298c2ecf20Sopenharmony_ci pci_common_init(&tsp2_pci); 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_ci return 0; 1328c2ecf20Sopenharmony_ci} 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_cisubsys_initcall(tsp2_pci_init); 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ci/***************************************************************************** 1378c2ecf20Sopenharmony_ci * Ethernet 1388c2ecf20Sopenharmony_ci ****************************************************************************/ 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_cistatic struct mv643xx_eth_platform_data tsp2_eth_data = { 1418c2ecf20Sopenharmony_ci .phy_addr = 0, 1428c2ecf20Sopenharmony_ci}; 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci/***************************************************************************** 1458c2ecf20Sopenharmony_ci * RTC 5C372a on I2C bus 1468c2ecf20Sopenharmony_ci ****************************************************************************/ 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_ci#define TSP2_RTC_GPIO 9 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_cistatic struct i2c_board_info __initdata tsp2_i2c_rtc = { 1518c2ecf20Sopenharmony_ci I2C_BOARD_INFO("rs5c372a", 0x32), 1528c2ecf20Sopenharmony_ci}; 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_ci/***************************************************************************** 1558c2ecf20Sopenharmony_ci * Terastation Pro II specific power off method via UART1-attached 1568c2ecf20Sopenharmony_ci * microcontroller 1578c2ecf20Sopenharmony_ci ****************************************************************************/ 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_ci#define UART1_REG(x) (UART1_VIRT_BASE + ((UART_##x) << 2)) 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_cistatic int tsp2_miconread(unsigned char *buf, int count) 1628c2ecf20Sopenharmony_ci{ 1638c2ecf20Sopenharmony_ci int i; 1648c2ecf20Sopenharmony_ci int timeout; 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ci for (i = 0; i < count; i++) { 1678c2ecf20Sopenharmony_ci timeout = 10; 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_ci while (!(readl(UART1_REG(LSR)) & UART_LSR_DR)) { 1708c2ecf20Sopenharmony_ci if (--timeout == 0) 1718c2ecf20Sopenharmony_ci break; 1728c2ecf20Sopenharmony_ci udelay(1000); 1738c2ecf20Sopenharmony_ci } 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_ci if (timeout == 0) 1768c2ecf20Sopenharmony_ci break; 1778c2ecf20Sopenharmony_ci buf[i] = readl(UART1_REG(RX)); 1788c2ecf20Sopenharmony_ci } 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ci /* return read bytes */ 1818c2ecf20Sopenharmony_ci return i; 1828c2ecf20Sopenharmony_ci} 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_cistatic int tsp2_miconwrite(const unsigned char *buf, int count) 1858c2ecf20Sopenharmony_ci{ 1868c2ecf20Sopenharmony_ci int i = 0; 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci while (count--) { 1898c2ecf20Sopenharmony_ci while (!(readl(UART1_REG(LSR)) & UART_LSR_THRE)) 1908c2ecf20Sopenharmony_ci barrier(); 1918c2ecf20Sopenharmony_ci writel(buf[i++], UART1_REG(TX)); 1928c2ecf20Sopenharmony_ci } 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_ci return 0; 1958c2ecf20Sopenharmony_ci} 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_cistatic int tsp2_miconsend(const unsigned char *data, int count) 1988c2ecf20Sopenharmony_ci{ 1998c2ecf20Sopenharmony_ci int i; 2008c2ecf20Sopenharmony_ci unsigned char checksum = 0; 2018c2ecf20Sopenharmony_ci unsigned char recv_buf[40]; 2028c2ecf20Sopenharmony_ci unsigned char send_buf[40]; 2038c2ecf20Sopenharmony_ci unsigned char correct_ack[3]; 2048c2ecf20Sopenharmony_ci int retry = 2; 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci /* Generate checksum */ 2078c2ecf20Sopenharmony_ci for (i = 0; i < count; i++) 2088c2ecf20Sopenharmony_ci checksum -= data[i]; 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci do { 2118c2ecf20Sopenharmony_ci /* Send data */ 2128c2ecf20Sopenharmony_ci tsp2_miconwrite(data, count); 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_ci /* send checksum */ 2158c2ecf20Sopenharmony_ci tsp2_miconwrite(&checksum, 1); 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ci if (tsp2_miconread(recv_buf, sizeof(recv_buf)) <= 3) { 2188c2ecf20Sopenharmony_ci printk(KERN_ERR ">%s: receive failed.\n", __func__); 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_ci /* send preamble to clear the receive buffer */ 2218c2ecf20Sopenharmony_ci memset(&send_buf, 0xff, sizeof(send_buf)); 2228c2ecf20Sopenharmony_ci tsp2_miconwrite(send_buf, sizeof(send_buf)); 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci /* make dummy reads */ 2258c2ecf20Sopenharmony_ci mdelay(100); 2268c2ecf20Sopenharmony_ci tsp2_miconread(recv_buf, sizeof(recv_buf)); 2278c2ecf20Sopenharmony_ci } else { 2288c2ecf20Sopenharmony_ci /* Generate expected ack */ 2298c2ecf20Sopenharmony_ci correct_ack[0] = 0x01; 2308c2ecf20Sopenharmony_ci correct_ack[1] = data[1]; 2318c2ecf20Sopenharmony_ci correct_ack[2] = 0x00; 2328c2ecf20Sopenharmony_ci 2338c2ecf20Sopenharmony_ci /* checksum Check */ 2348c2ecf20Sopenharmony_ci if ((recv_buf[0] + recv_buf[1] + recv_buf[2] + 2358c2ecf20Sopenharmony_ci recv_buf[3]) & 0xFF) { 2368c2ecf20Sopenharmony_ci printk(KERN_ERR ">%s: Checksum Error : " 2378c2ecf20Sopenharmony_ci "Received data[%02x, %02x, %02x, %02x]" 2388c2ecf20Sopenharmony_ci "\n", __func__, recv_buf[0], 2398c2ecf20Sopenharmony_ci recv_buf[1], recv_buf[2], recv_buf[3]); 2408c2ecf20Sopenharmony_ci } else { 2418c2ecf20Sopenharmony_ci /* Check Received Data */ 2428c2ecf20Sopenharmony_ci if (correct_ack[0] == recv_buf[0] && 2438c2ecf20Sopenharmony_ci correct_ack[1] == recv_buf[1] && 2448c2ecf20Sopenharmony_ci correct_ack[2] == recv_buf[2]) { 2458c2ecf20Sopenharmony_ci /* Interval for next command */ 2468c2ecf20Sopenharmony_ci mdelay(10); 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_ci /* Receive ACK */ 2498c2ecf20Sopenharmony_ci return 0; 2508c2ecf20Sopenharmony_ci } 2518c2ecf20Sopenharmony_ci } 2528c2ecf20Sopenharmony_ci /* Received NAK or illegal Data */ 2538c2ecf20Sopenharmony_ci printk(KERN_ERR ">%s: Error : NAK or Illegal Data " 2548c2ecf20Sopenharmony_ci "Received\n", __func__); 2558c2ecf20Sopenharmony_ci } 2568c2ecf20Sopenharmony_ci } while (retry--); 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci /* Interval for next command */ 2598c2ecf20Sopenharmony_ci mdelay(10); 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci return -1; 2628c2ecf20Sopenharmony_ci} 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_cistatic void tsp2_power_off(void) 2658c2ecf20Sopenharmony_ci{ 2668c2ecf20Sopenharmony_ci const unsigned char watchdogkill[] = {0x01, 0x35, 0x00}; 2678c2ecf20Sopenharmony_ci const unsigned char shutdownwait[] = {0x00, 0x0c}; 2688c2ecf20Sopenharmony_ci const unsigned char poweroff[] = {0x00, 0x06}; 2698c2ecf20Sopenharmony_ci /* 38400 baud divisor */ 2708c2ecf20Sopenharmony_ci const unsigned divisor = ((orion5x_tclk + (8 * 38400)) / (16 * 38400)); 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_ci pr_info("%s: triggering power-off...\n", __func__); 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_ci /* hijack uart1 and reset into sane state (38400,8n1,even parity) */ 2758c2ecf20Sopenharmony_ci writel(0x83, UART1_REG(LCR)); 2768c2ecf20Sopenharmony_ci writel(divisor & 0xff, UART1_REG(DLL)); 2778c2ecf20Sopenharmony_ci writel((divisor >> 8) & 0xff, UART1_REG(DLM)); 2788c2ecf20Sopenharmony_ci writel(0x1b, UART1_REG(LCR)); 2798c2ecf20Sopenharmony_ci writel(0x00, UART1_REG(IER)); 2808c2ecf20Sopenharmony_ci writel(0x07, UART1_REG(FCR)); 2818c2ecf20Sopenharmony_ci writel(0x00, UART1_REG(MCR)); 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ci /* Send the commands to shutdown the Terastation Pro II */ 2848c2ecf20Sopenharmony_ci tsp2_miconsend(watchdogkill, sizeof(watchdogkill)) ; 2858c2ecf20Sopenharmony_ci tsp2_miconsend(shutdownwait, sizeof(shutdownwait)) ; 2868c2ecf20Sopenharmony_ci tsp2_miconsend(poweroff, sizeof(poweroff)); 2878c2ecf20Sopenharmony_ci} 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_ci/***************************************************************************** 2908c2ecf20Sopenharmony_ci * General Setup 2918c2ecf20Sopenharmony_ci ****************************************************************************/ 2928c2ecf20Sopenharmony_cistatic unsigned int tsp2_mpp_modes[] __initdata = { 2938c2ecf20Sopenharmony_ci MPP0_PCIE_RST_OUTn, 2948c2ecf20Sopenharmony_ci MPP1_UNUSED, 2958c2ecf20Sopenharmony_ci MPP2_UNUSED, 2968c2ecf20Sopenharmony_ci MPP3_UNUSED, 2978c2ecf20Sopenharmony_ci MPP4_NAND, /* BOOT NAND Flash REn */ 2988c2ecf20Sopenharmony_ci MPP5_NAND, /* BOOT NAND Flash WEn */ 2998c2ecf20Sopenharmony_ci MPP6_NAND, /* BOOT NAND Flash HREn[0] */ 3008c2ecf20Sopenharmony_ci MPP7_NAND, /* BOOT NAND Flash WEn[0] */ 3018c2ecf20Sopenharmony_ci MPP8_GPIO, /* MICON int */ 3028c2ecf20Sopenharmony_ci MPP9_GPIO, /* RTC int */ 3038c2ecf20Sopenharmony_ci MPP10_UNUSED, 3048c2ecf20Sopenharmony_ci MPP11_GPIO, /* PCI Int A */ 3058c2ecf20Sopenharmony_ci MPP12_UNUSED, 3068c2ecf20Sopenharmony_ci MPP13_GPIO, /* UPS on UART0 enable */ 3078c2ecf20Sopenharmony_ci MPP14_GPIO, /* UPS low battery detection */ 3088c2ecf20Sopenharmony_ci MPP15_UNUSED, 3098c2ecf20Sopenharmony_ci MPP16_UART, /* UART1 RXD */ 3108c2ecf20Sopenharmony_ci MPP17_UART, /* UART1 TXD */ 3118c2ecf20Sopenharmony_ci MPP18_UART, /* UART1 CTSn */ 3128c2ecf20Sopenharmony_ci MPP19_UART, /* UART1 RTSn */ 3138c2ecf20Sopenharmony_ci 0, 3148c2ecf20Sopenharmony_ci}; 3158c2ecf20Sopenharmony_ci 3168c2ecf20Sopenharmony_cistatic void __init tsp2_init(void) 3178c2ecf20Sopenharmony_ci{ 3188c2ecf20Sopenharmony_ci /* 3198c2ecf20Sopenharmony_ci * Setup basic Orion functions. Need to be called early. 3208c2ecf20Sopenharmony_ci */ 3218c2ecf20Sopenharmony_ci orion5x_init(); 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_ci orion5x_mpp_conf(tsp2_mpp_modes); 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_ci /* 3268c2ecf20Sopenharmony_ci * Configure peripherals. 3278c2ecf20Sopenharmony_ci */ 3288c2ecf20Sopenharmony_ci mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET, 3298c2ecf20Sopenharmony_ci ORION_MBUS_DEVBUS_BOOT_ATTR, 3308c2ecf20Sopenharmony_ci TSP2_NOR_BOOT_BASE, 3318c2ecf20Sopenharmony_ci TSP2_NOR_BOOT_SIZE); 3328c2ecf20Sopenharmony_ci platform_device_register(&tsp2_nor_flash); 3338c2ecf20Sopenharmony_ci 3348c2ecf20Sopenharmony_ci orion5x_ehci0_init(); 3358c2ecf20Sopenharmony_ci orion5x_eth_init(&tsp2_eth_data); 3368c2ecf20Sopenharmony_ci orion5x_i2c_init(); 3378c2ecf20Sopenharmony_ci orion5x_uart0_init(); 3388c2ecf20Sopenharmony_ci orion5x_uart1_init(); 3398c2ecf20Sopenharmony_ci 3408c2ecf20Sopenharmony_ci /* Get RTC IRQ and register the chip */ 3418c2ecf20Sopenharmony_ci if (gpio_request(TSP2_RTC_GPIO, "rtc") == 0) { 3428c2ecf20Sopenharmony_ci if (gpio_direction_input(TSP2_RTC_GPIO) == 0) 3438c2ecf20Sopenharmony_ci tsp2_i2c_rtc.irq = gpio_to_irq(TSP2_RTC_GPIO); 3448c2ecf20Sopenharmony_ci else 3458c2ecf20Sopenharmony_ci gpio_free(TSP2_RTC_GPIO); 3468c2ecf20Sopenharmony_ci } 3478c2ecf20Sopenharmony_ci if (tsp2_i2c_rtc.irq == 0) 3488c2ecf20Sopenharmony_ci pr_warn("tsp2_init: failed to get RTC IRQ\n"); 3498c2ecf20Sopenharmony_ci i2c_register_board_info(0, &tsp2_i2c_rtc, 1); 3508c2ecf20Sopenharmony_ci 3518c2ecf20Sopenharmony_ci /* register Terastation Pro II specific power-off method */ 3528c2ecf20Sopenharmony_ci pm_power_off = tsp2_power_off; 3538c2ecf20Sopenharmony_ci} 3548c2ecf20Sopenharmony_ci 3558c2ecf20Sopenharmony_ciMACHINE_START(TERASTATION_PRO2, "Buffalo Terastation Pro II/Live") 3568c2ecf20Sopenharmony_ci /* Maintainer: Sylver Bruneau <sylver.bruneau@googlemail.com> */ 3578c2ecf20Sopenharmony_ci .atag_offset = 0x100, 3588c2ecf20Sopenharmony_ci .nr_irqs = ORION5X_NR_IRQS, 3598c2ecf20Sopenharmony_ci .init_machine = tsp2_init, 3608c2ecf20Sopenharmony_ci .map_io = orion5x_map_io, 3618c2ecf20Sopenharmony_ci .init_early = orion5x_init_early, 3628c2ecf20Sopenharmony_ci .init_irq = orion5x_init_irq, 3638c2ecf20Sopenharmony_ci .init_time = orion5x_timer_init, 3648c2ecf20Sopenharmony_ci .fixup = tag_fixup_mem32, 3658c2ecf20Sopenharmony_ci .restart = orion5x_restart, 3668c2ecf20Sopenharmony_ciMACHINE_END 367