1b08d5af3SMartin Michlmayr /* 2b08d5af3SMartin Michlmayr * Copyright (C) 2007 Herbert Valerio Riedel <hvr@gnu.org> 3b08d5af3SMartin Michlmayr * Copyright (C) 2008 Martin Michlmayr <tbm@cyrius.com> 4b08d5af3SMartin Michlmayr * 5b08d5af3SMartin Michlmayr * This program is free software; you can redistribute it and/or modify 6b08d5af3SMartin Michlmayr * it under the terms of the GNU Lesser General Public License as 7b08d5af3SMartin Michlmayr * published by the Free Software Foundation; either version 2 of the 8b08d5af3SMartin Michlmayr * License, or (at your option) any later version. 9b08d5af3SMartin Michlmayr */ 10b08d5af3SMartin Michlmayr 11b08d5af3SMartin Michlmayr #include <linux/kernel.h> 12b08d5af3SMartin Michlmayr #include <linux/init.h> 13b08d5af3SMartin Michlmayr #include <linux/platform_device.h> 14b08d5af3SMartin Michlmayr #include <linux/irq.h> 15b08d5af3SMartin Michlmayr #include <linux/mtd/physmap.h> 16b08d5af3SMartin Michlmayr #include <linux/mv643xx_eth.h> 17b08d5af3SMartin Michlmayr #include <linux/leds.h> 18b08d5af3SMartin Michlmayr #include <linux/gpio_keys.h> 19b08d5af3SMartin Michlmayr #include <linux/input.h> 20b08d5af3SMartin Michlmayr #include <linux/i2c.h> 21b08d5af3SMartin Michlmayr #include <linux/ata_platform.h> 22b08d5af3SMartin Michlmayr #include <asm/mach-types.h> 23b08d5af3SMartin Michlmayr #include <asm/gpio.h> 24b08d5af3SMartin Michlmayr #include <asm/mach/arch.h> 25a09e64fbSRussell King #include <mach/orion5x.h> 26b08d5af3SMartin Michlmayr #include "common.h" 27b08d5af3SMartin Michlmayr #include "mpp.h" 28b08d5af3SMartin Michlmayr 29b08d5af3SMartin Michlmayr #define MV2120_NOR_BOOT_BASE 0xf4000000 30b08d5af3SMartin Michlmayr #define MV2120_NOR_BOOT_SIZE SZ_512K 31b08d5af3SMartin Michlmayr 32b08d5af3SMartin Michlmayr #define MV2120_GPIO_RTC_IRQ 3 33b08d5af3SMartin Michlmayr #define MV2120_GPIO_KEY_RESET 17 34b08d5af3SMartin Michlmayr #define MV2120_GPIO_KEY_POWER 18 35b08d5af3SMartin Michlmayr #define MV2120_GPIO_POWER_OFF 19 36b08d5af3SMartin Michlmayr 37b08d5af3SMartin Michlmayr 38b08d5af3SMartin Michlmayr /***************************************************************************** 39b08d5af3SMartin Michlmayr * Ethernet 40b08d5af3SMartin Michlmayr ****************************************************************************/ 41b08d5af3SMartin Michlmayr static struct mv643xx_eth_platform_data mv2120_eth_data = { 42b08d5af3SMartin Michlmayr .phy_addr = 8, 43b08d5af3SMartin Michlmayr }; 44b08d5af3SMartin Michlmayr 45b08d5af3SMartin Michlmayr static struct mv_sata_platform_data mv2120_sata_data = { 46b08d5af3SMartin Michlmayr .n_ports = 2, 47b08d5af3SMartin Michlmayr }; 48b08d5af3SMartin Michlmayr 49b08d5af3SMartin Michlmayr static struct mtd_partition mv2120_partitions[] = { 50b08d5af3SMartin Michlmayr { 51b08d5af3SMartin Michlmayr .name = "firmware", 52b08d5af3SMartin Michlmayr .size = 0x00080000, 53b08d5af3SMartin Michlmayr .offset = 0, 54b08d5af3SMartin Michlmayr }, 55b08d5af3SMartin Michlmayr }; 56b08d5af3SMartin Michlmayr 57b08d5af3SMartin Michlmayr static struct physmap_flash_data mv2120_nor_flash_data = { 58b08d5af3SMartin Michlmayr .width = 1, 59b08d5af3SMartin Michlmayr .parts = mv2120_partitions, 60b08d5af3SMartin Michlmayr .nr_parts = ARRAY_SIZE(mv2120_partitions) 61b08d5af3SMartin Michlmayr }; 62b08d5af3SMartin Michlmayr 63b08d5af3SMartin Michlmayr static struct resource mv2120_nor_flash_resource = { 64b08d5af3SMartin Michlmayr .flags = IORESOURCE_MEM, 65b08d5af3SMartin Michlmayr .start = MV2120_NOR_BOOT_BASE, 66b08d5af3SMartin Michlmayr .end = MV2120_NOR_BOOT_BASE + MV2120_NOR_BOOT_SIZE - 1, 67b08d5af3SMartin Michlmayr }; 68b08d5af3SMartin Michlmayr 69b08d5af3SMartin Michlmayr static struct platform_device mv2120_nor_flash = { 70b08d5af3SMartin Michlmayr .name = "physmap-flash", 71b08d5af3SMartin Michlmayr .id = 0, 72b08d5af3SMartin Michlmayr .dev = { 73b08d5af3SMartin Michlmayr .platform_data = &mv2120_nor_flash_data, 74b08d5af3SMartin Michlmayr }, 75b08d5af3SMartin Michlmayr .resource = &mv2120_nor_flash_resource, 76b08d5af3SMartin Michlmayr .num_resources = 1, 77b08d5af3SMartin Michlmayr }; 78b08d5af3SMartin Michlmayr 79b08d5af3SMartin Michlmayr static struct gpio_keys_button mv2120_buttons[] = { 80b08d5af3SMartin Michlmayr { 81b08d5af3SMartin Michlmayr .code = KEY_RESTART, 82b08d5af3SMartin Michlmayr .gpio = MV2120_GPIO_KEY_RESET, 83b08d5af3SMartin Michlmayr .desc = "reset", 84b08d5af3SMartin Michlmayr .active_low = 1, 85b08d5af3SMartin Michlmayr }, { 86b08d5af3SMartin Michlmayr .code = KEY_POWER, 87b08d5af3SMartin Michlmayr .gpio = MV2120_GPIO_KEY_POWER, 88b08d5af3SMartin Michlmayr .desc = "power", 89b08d5af3SMartin Michlmayr .active_low = 1, 90b08d5af3SMartin Michlmayr }, 91b08d5af3SMartin Michlmayr }; 92b08d5af3SMartin Michlmayr 93b08d5af3SMartin Michlmayr static struct gpio_keys_platform_data mv2120_button_data = { 94b08d5af3SMartin Michlmayr .buttons = mv2120_buttons, 95b08d5af3SMartin Michlmayr .nbuttons = ARRAY_SIZE(mv2120_buttons), 96b08d5af3SMartin Michlmayr }; 97b08d5af3SMartin Michlmayr 98b08d5af3SMartin Michlmayr static struct platform_device mv2120_button_device = { 99b08d5af3SMartin Michlmayr .name = "gpio-keys", 100b08d5af3SMartin Michlmayr .id = -1, 101b08d5af3SMartin Michlmayr .num_resources = 0, 102b08d5af3SMartin Michlmayr .dev = { 103b08d5af3SMartin Michlmayr .platform_data = &mv2120_button_data, 104b08d5af3SMartin Michlmayr }, 105b08d5af3SMartin Michlmayr }; 106b08d5af3SMartin Michlmayr 107b08d5af3SMartin Michlmayr 108b08d5af3SMartin Michlmayr /**************************************************************************** 109b08d5af3SMartin Michlmayr * General Setup 110b08d5af3SMartin Michlmayr ****************************************************************************/ 111b08d5af3SMartin Michlmayr static struct orion5x_mpp_mode mv2120_mpp_modes[] __initdata = { 112b08d5af3SMartin Michlmayr { 0, MPP_GPIO }, /* Sys status LED */ 113b08d5af3SMartin Michlmayr { 1, MPP_GPIO }, /* Sys error LED */ 114b08d5af3SMartin Michlmayr { 2, MPP_GPIO }, /* OverTemp interrupt */ 115b08d5af3SMartin Michlmayr { 3, MPP_GPIO }, /* RTC interrupt */ 116b08d5af3SMartin Michlmayr { 4, MPP_GPIO }, /* V_LED 5V */ 117b08d5af3SMartin Michlmayr { 5, MPP_GPIO }, /* V_LED 3.3V */ 118b08d5af3SMartin Michlmayr { 6, MPP_UNUSED }, 119b08d5af3SMartin Michlmayr { 7, MPP_UNUSED }, 120b08d5af3SMartin Michlmayr { 8, MPP_GPIO }, /* SATA 0 fail LED */ 121b08d5af3SMartin Michlmayr { 9, MPP_GPIO }, /* SATA 1 fail LED */ 122b08d5af3SMartin Michlmayr { 10, MPP_UNUSED }, 123b08d5af3SMartin Michlmayr { 11, MPP_UNUSED }, 124b08d5af3SMartin Michlmayr { 12, MPP_SATA_LED }, /* SATA 0 presence */ 125b08d5af3SMartin Michlmayr { 13, MPP_SATA_LED }, /* SATA 1 presence */ 126b08d5af3SMartin Michlmayr { 14, MPP_SATA_LED }, /* SATA 0 active */ 127b08d5af3SMartin Michlmayr { 15, MPP_SATA_LED }, /* SATA 1 active */ 128b08d5af3SMartin Michlmayr { 16, MPP_UNUSED }, 129b08d5af3SMartin Michlmayr { 17, MPP_GPIO }, /* Reset button */ 130b08d5af3SMartin Michlmayr { 18, MPP_GPIO }, /* Power button */ 131b08d5af3SMartin Michlmayr { 19, MPP_GPIO }, /* Power off */ 132b08d5af3SMartin Michlmayr { -1 }, 133b08d5af3SMartin Michlmayr }; 134b08d5af3SMartin Michlmayr 135b08d5af3SMartin Michlmayr static struct i2c_board_info __initdata mv2120_i2c_rtc = { 136cdd3c5ecSMartin Michlmayr I2C_BOARD_INFO("pcf8563", 0x51), 137b08d5af3SMartin Michlmayr .irq = 0, 138b08d5af3SMartin Michlmayr }; 139b08d5af3SMartin Michlmayr 1402e1117d3SMartin Michlmayr static struct gpio_led mv2120_led_pins[] = { 1412e1117d3SMartin Michlmayr { 1422e1117d3SMartin Michlmayr .name = "mv2120:blue:health", 1432e1117d3SMartin Michlmayr .gpio = 0, 1442e1117d3SMartin Michlmayr }, 1452e1117d3SMartin Michlmayr { 1462e1117d3SMartin Michlmayr .name = "mv2120:red:health", 1472e1117d3SMartin Michlmayr .gpio = 1, 1482e1117d3SMartin Michlmayr }, 1492e1117d3SMartin Michlmayr { 1502e1117d3SMartin Michlmayr .name = "mv2120:led:bright", 1512e1117d3SMartin Michlmayr .gpio = 4, 1522e1117d3SMartin Michlmayr .default_trigger = "default-on", 1532e1117d3SMartin Michlmayr }, 1542e1117d3SMartin Michlmayr { 1552e1117d3SMartin Michlmayr .name = "mv2120:led:dimmed", 1562e1117d3SMartin Michlmayr .gpio = 5, 1572e1117d3SMartin Michlmayr }, 1582e1117d3SMartin Michlmayr { 1592e1117d3SMartin Michlmayr .name = "mv2120:red:sata0", 1602e1117d3SMartin Michlmayr .gpio = 8, 1612e1117d3SMartin Michlmayr .active_low = 1, 1622e1117d3SMartin Michlmayr }, 1632e1117d3SMartin Michlmayr { 1642e1117d3SMartin Michlmayr .name = "mv2120:red:sata1", 1652e1117d3SMartin Michlmayr .gpio = 9, 1662e1117d3SMartin Michlmayr .active_low = 1, 1672e1117d3SMartin Michlmayr }, 1682e1117d3SMartin Michlmayr 1692e1117d3SMartin Michlmayr }; 1702e1117d3SMartin Michlmayr 1712e1117d3SMartin Michlmayr static struct gpio_led_platform_data mv2120_led_data = { 1722e1117d3SMartin Michlmayr .leds = mv2120_led_pins, 1732e1117d3SMartin Michlmayr .num_leds = ARRAY_SIZE(mv2120_led_pins), 1742e1117d3SMartin Michlmayr }; 1752e1117d3SMartin Michlmayr 1762e1117d3SMartin Michlmayr static struct platform_device mv2120_leds = { 1772e1117d3SMartin Michlmayr .name = "leds-gpio", 1782e1117d3SMartin Michlmayr .id = -1, 1792e1117d3SMartin Michlmayr .dev = { 1802e1117d3SMartin Michlmayr .platform_data = &mv2120_led_data, 1812e1117d3SMartin Michlmayr } 1822e1117d3SMartin Michlmayr }; 1832e1117d3SMartin Michlmayr 184b08d5af3SMartin Michlmayr static void mv2120_power_off(void) 185b08d5af3SMartin Michlmayr { 186b08d5af3SMartin Michlmayr pr_info("%s: triggering power-off...\n", __func__); 187b08d5af3SMartin Michlmayr gpio_set_value(MV2120_GPIO_POWER_OFF, 0); 188b08d5af3SMartin Michlmayr } 189b08d5af3SMartin Michlmayr 190b08d5af3SMartin Michlmayr static void __init mv2120_init(void) 191b08d5af3SMartin Michlmayr { 192b08d5af3SMartin Michlmayr /* Setup basic Orion functions. Need to be called early. */ 193b08d5af3SMartin Michlmayr orion5x_init(); 194b08d5af3SMartin Michlmayr 195b08d5af3SMartin Michlmayr orion5x_mpp_conf(mv2120_mpp_modes); 196b08d5af3SMartin Michlmayr 197b08d5af3SMartin Michlmayr /* 198b08d5af3SMartin Michlmayr * Configure peripherals. 199b08d5af3SMartin Michlmayr */ 200b08d5af3SMartin Michlmayr orion5x_ehci0_init(); 201b08d5af3SMartin Michlmayr orion5x_ehci1_init(); 202b08d5af3SMartin Michlmayr orion5x_eth_init(&mv2120_eth_data); 203b08d5af3SMartin Michlmayr orion5x_i2c_init(); 204b08d5af3SMartin Michlmayr orion5x_sata_init(&mv2120_sata_data); 205b08d5af3SMartin Michlmayr orion5x_uart0_init(); 2061d5a1a6eSSaeed Bishara orion5x_xor_init(); 207b08d5af3SMartin Michlmayr 208b08d5af3SMartin Michlmayr orion5x_setup_dev_boot_win(MV2120_NOR_BOOT_BASE, MV2120_NOR_BOOT_SIZE); 209b08d5af3SMartin Michlmayr platform_device_register(&mv2120_nor_flash); 210b08d5af3SMartin Michlmayr 211b08d5af3SMartin Michlmayr platform_device_register(&mv2120_button_device); 212b08d5af3SMartin Michlmayr 213b08d5af3SMartin Michlmayr if (gpio_request(MV2120_GPIO_RTC_IRQ, "rtc") == 0) { 214b08d5af3SMartin Michlmayr if (gpio_direction_input(MV2120_GPIO_RTC_IRQ) == 0) 215b08d5af3SMartin Michlmayr mv2120_i2c_rtc.irq = gpio_to_irq(MV2120_GPIO_RTC_IRQ); 216b08d5af3SMartin Michlmayr else 217b08d5af3SMartin Michlmayr gpio_free(MV2120_GPIO_RTC_IRQ); 218b08d5af3SMartin Michlmayr } 219b08d5af3SMartin Michlmayr i2c_register_board_info(0, &mv2120_i2c_rtc, 1); 2202e1117d3SMartin Michlmayr platform_device_register(&mv2120_leds); 221b08d5af3SMartin Michlmayr 222b08d5af3SMartin Michlmayr /* register mv2120 specific power-off method */ 223b08d5af3SMartin Michlmayr if (gpio_request(MV2120_GPIO_POWER_OFF, "POWEROFF") != 0 || 224b08d5af3SMartin Michlmayr gpio_direction_output(MV2120_GPIO_POWER_OFF, 1) != 0) 225b08d5af3SMartin Michlmayr pr_err("mv2120: failed to setup power-off GPIO\n"); 226b08d5af3SMartin Michlmayr pm_power_off = mv2120_power_off; 227b08d5af3SMartin Michlmayr } 228b08d5af3SMartin Michlmayr 229b08d5af3SMartin Michlmayr /* Warning: HP uses a wrong mach-type (=526) in their bootloader */ 230b08d5af3SMartin Michlmayr MACHINE_START(MV2120, "HP Media Vault mv2120") 231b08d5af3SMartin Michlmayr /* Maintainer: Martin Michlmayr <tbm@cyrius.com> */ 232b08d5af3SMartin Michlmayr .phys_io = ORION5X_REGS_PHYS_BASE, 233b08d5af3SMartin Michlmayr .io_pg_offst = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC, 234b08d5af3SMartin Michlmayr .boot_params = 0x00000100, 235b08d5af3SMartin Michlmayr .init_machine = mv2120_init, 236b08d5af3SMartin Michlmayr .map_io = orion5x_map_io, 237b08d5af3SMartin Michlmayr .init_irq = orion5x_init_irq, 238b08d5af3SMartin Michlmayr .timer = &orion5x_timer, 239b08d5af3SMartin Michlmayr .fixup = tag_fixup_mem32 240b08d5af3SMartin Michlmayr MACHINE_END 241