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 */ 102f8163baSRussell King #include <linux/gpio.h> 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/mach/arch.h> 24a09e64fbSRussell King #include <mach/orion5x.h> 25b08d5af3SMartin Michlmayr #include "common.h" 26b08d5af3SMartin Michlmayr #include "mpp.h" 27b08d5af3SMartin Michlmayr 28b08d5af3SMartin Michlmayr #define MV2120_NOR_BOOT_BASE 0xf4000000 29b08d5af3SMartin Michlmayr #define MV2120_NOR_BOOT_SIZE SZ_512K 30b08d5af3SMartin Michlmayr 31b08d5af3SMartin Michlmayr #define MV2120_GPIO_RTC_IRQ 3 32b08d5af3SMartin Michlmayr #define MV2120_GPIO_KEY_RESET 17 33b08d5af3SMartin Michlmayr #define MV2120_GPIO_KEY_POWER 18 34b08d5af3SMartin Michlmayr #define MV2120_GPIO_POWER_OFF 19 35b08d5af3SMartin Michlmayr 36b08d5af3SMartin Michlmayr 37b08d5af3SMartin Michlmayr /***************************************************************************** 38b08d5af3SMartin Michlmayr * Ethernet 39b08d5af3SMartin Michlmayr ****************************************************************************/ 40b08d5af3SMartin Michlmayr static struct mv643xx_eth_platform_data mv2120_eth_data = { 41ac840605SLennert Buytenhek .phy_addr = MV643XX_ETH_PHY_ADDR(8), 42b08d5af3SMartin Michlmayr }; 43b08d5af3SMartin Michlmayr 44b08d5af3SMartin Michlmayr static struct mv_sata_platform_data mv2120_sata_data = { 45b08d5af3SMartin Michlmayr .n_ports = 2, 46b08d5af3SMartin Michlmayr }; 47b08d5af3SMartin Michlmayr 48b08d5af3SMartin Michlmayr static struct mtd_partition mv2120_partitions[] = { 49b08d5af3SMartin Michlmayr { 50b08d5af3SMartin Michlmayr .name = "firmware", 51b08d5af3SMartin Michlmayr .size = 0x00080000, 52b08d5af3SMartin Michlmayr .offset = 0, 53b08d5af3SMartin Michlmayr }, 54b08d5af3SMartin Michlmayr }; 55b08d5af3SMartin Michlmayr 56b08d5af3SMartin Michlmayr static struct physmap_flash_data mv2120_nor_flash_data = { 57b08d5af3SMartin Michlmayr .width = 1, 58b08d5af3SMartin Michlmayr .parts = mv2120_partitions, 59b08d5af3SMartin Michlmayr .nr_parts = ARRAY_SIZE(mv2120_partitions) 60b08d5af3SMartin Michlmayr }; 61b08d5af3SMartin Michlmayr 62b08d5af3SMartin Michlmayr static struct resource mv2120_nor_flash_resource = { 63b08d5af3SMartin Michlmayr .flags = IORESOURCE_MEM, 64b08d5af3SMartin Michlmayr .start = MV2120_NOR_BOOT_BASE, 65b08d5af3SMartin Michlmayr .end = MV2120_NOR_BOOT_BASE + MV2120_NOR_BOOT_SIZE - 1, 66b08d5af3SMartin Michlmayr }; 67b08d5af3SMartin Michlmayr 68b08d5af3SMartin Michlmayr static struct platform_device mv2120_nor_flash = { 69b08d5af3SMartin Michlmayr .name = "physmap-flash", 70b08d5af3SMartin Michlmayr .id = 0, 71b08d5af3SMartin Michlmayr .dev = { 72b08d5af3SMartin Michlmayr .platform_data = &mv2120_nor_flash_data, 73b08d5af3SMartin Michlmayr }, 74b08d5af3SMartin Michlmayr .resource = &mv2120_nor_flash_resource, 75b08d5af3SMartin Michlmayr .num_resources = 1, 76b08d5af3SMartin Michlmayr }; 77b08d5af3SMartin Michlmayr 78b08d5af3SMartin Michlmayr static struct gpio_keys_button mv2120_buttons[] = { 79b08d5af3SMartin Michlmayr { 80b08d5af3SMartin Michlmayr .code = KEY_RESTART, 81b08d5af3SMartin Michlmayr .gpio = MV2120_GPIO_KEY_RESET, 82b08d5af3SMartin Michlmayr .desc = "reset", 83b08d5af3SMartin Michlmayr .active_low = 1, 84b08d5af3SMartin Michlmayr }, { 85b08d5af3SMartin Michlmayr .code = KEY_POWER, 86b08d5af3SMartin Michlmayr .gpio = MV2120_GPIO_KEY_POWER, 87b08d5af3SMartin Michlmayr .desc = "power", 88b08d5af3SMartin Michlmayr .active_low = 1, 89b08d5af3SMartin Michlmayr }, 90b08d5af3SMartin Michlmayr }; 91b08d5af3SMartin Michlmayr 92b08d5af3SMartin Michlmayr static struct gpio_keys_platform_data mv2120_button_data = { 93b08d5af3SMartin Michlmayr .buttons = mv2120_buttons, 94b08d5af3SMartin Michlmayr .nbuttons = ARRAY_SIZE(mv2120_buttons), 95b08d5af3SMartin Michlmayr }; 96b08d5af3SMartin Michlmayr 97b08d5af3SMartin Michlmayr static struct platform_device mv2120_button_device = { 98b08d5af3SMartin Michlmayr .name = "gpio-keys", 99b08d5af3SMartin Michlmayr .id = -1, 100b08d5af3SMartin Michlmayr .num_resources = 0, 101b08d5af3SMartin Michlmayr .dev = { 102b08d5af3SMartin Michlmayr .platform_data = &mv2120_button_data, 103b08d5af3SMartin Michlmayr }, 104b08d5af3SMartin Michlmayr }; 105b08d5af3SMartin Michlmayr 106b08d5af3SMartin Michlmayr 107b08d5af3SMartin Michlmayr /**************************************************************************** 108b08d5af3SMartin Michlmayr * General Setup 109b08d5af3SMartin Michlmayr ****************************************************************************/ 110554cdaefSAndrew Lunn static unsigned int mv2120_mpp_modes[] __initdata = { 111554cdaefSAndrew Lunn MPP0_GPIO, /* Sys status LED */ 112554cdaefSAndrew Lunn MPP1_GPIO, /* Sys error LED */ 113554cdaefSAndrew Lunn MPP2_GPIO, /* OverTemp interrupt */ 114554cdaefSAndrew Lunn MPP3_GPIO, /* RTC interrupt */ 115554cdaefSAndrew Lunn MPP4_GPIO, /* V_LED 5V */ 116554cdaefSAndrew Lunn MPP5_GPIO, /* V_LED 3.3V */ 117554cdaefSAndrew Lunn MPP6_UNUSED, 118554cdaefSAndrew Lunn MPP7_UNUSED, 119554cdaefSAndrew Lunn MPP8_GPIO, /* SATA 0 fail LED */ 120554cdaefSAndrew Lunn MPP9_GPIO, /* SATA 1 fail LED */ 121554cdaefSAndrew Lunn MPP10_UNUSED, 122554cdaefSAndrew Lunn MPP11_UNUSED, 123554cdaefSAndrew Lunn MPP12_SATA_LED, /* SATA 0 presence */ 124554cdaefSAndrew Lunn MPP13_SATA_LED, /* SATA 1 presence */ 125554cdaefSAndrew Lunn MPP14_SATA_LED, /* SATA 0 active */ 126554cdaefSAndrew Lunn MPP15_SATA_LED, /* SATA 1 active */ 127554cdaefSAndrew Lunn MPP16_UNUSED, 128554cdaefSAndrew Lunn MPP17_GPIO, /* Reset button */ 129554cdaefSAndrew Lunn MPP18_GPIO, /* Power button */ 130554cdaefSAndrew Lunn MPP19_GPIO, /* Power off */ 131554cdaefSAndrew Lunn 0, 132b08d5af3SMartin Michlmayr }; 133b08d5af3SMartin Michlmayr 134b08d5af3SMartin Michlmayr static struct i2c_board_info __initdata mv2120_i2c_rtc = { 135cdd3c5ecSMartin Michlmayr I2C_BOARD_INFO("pcf8563", 0x51), 136b08d5af3SMartin Michlmayr .irq = 0, 137b08d5af3SMartin Michlmayr }; 138b08d5af3SMartin Michlmayr 1392e1117d3SMartin Michlmayr static struct gpio_led mv2120_led_pins[] = { 1402e1117d3SMartin Michlmayr { 1412e1117d3SMartin Michlmayr .name = "mv2120:blue:health", 1422e1117d3SMartin Michlmayr .gpio = 0, 1432e1117d3SMartin Michlmayr }, 1442e1117d3SMartin Michlmayr { 1452e1117d3SMartin Michlmayr .name = "mv2120:red:health", 1462e1117d3SMartin Michlmayr .gpio = 1, 1472e1117d3SMartin Michlmayr }, 1482e1117d3SMartin Michlmayr { 1492e1117d3SMartin Michlmayr .name = "mv2120:led:bright", 1502e1117d3SMartin Michlmayr .gpio = 4, 1512e1117d3SMartin Michlmayr .default_trigger = "default-on", 1522e1117d3SMartin Michlmayr }, 1532e1117d3SMartin Michlmayr { 1542e1117d3SMartin Michlmayr .name = "mv2120:led:dimmed", 1552e1117d3SMartin Michlmayr .gpio = 5, 1562e1117d3SMartin Michlmayr }, 1572e1117d3SMartin Michlmayr { 1582e1117d3SMartin Michlmayr .name = "mv2120:red:sata0", 1592e1117d3SMartin Michlmayr .gpio = 8, 1602e1117d3SMartin Michlmayr .active_low = 1, 1612e1117d3SMartin Michlmayr }, 1622e1117d3SMartin Michlmayr { 1632e1117d3SMartin Michlmayr .name = "mv2120:red:sata1", 1642e1117d3SMartin Michlmayr .gpio = 9, 1652e1117d3SMartin Michlmayr .active_low = 1, 1662e1117d3SMartin Michlmayr }, 1672e1117d3SMartin Michlmayr 1682e1117d3SMartin Michlmayr }; 1692e1117d3SMartin Michlmayr 1702e1117d3SMartin Michlmayr static struct gpio_led_platform_data mv2120_led_data = { 1712e1117d3SMartin Michlmayr .leds = mv2120_led_pins, 1722e1117d3SMartin Michlmayr .num_leds = ARRAY_SIZE(mv2120_led_pins), 1732e1117d3SMartin Michlmayr }; 1742e1117d3SMartin Michlmayr 1752e1117d3SMartin Michlmayr static struct platform_device mv2120_leds = { 1762e1117d3SMartin Michlmayr .name = "leds-gpio", 1772e1117d3SMartin Michlmayr .id = -1, 1782e1117d3SMartin Michlmayr .dev = { 1792e1117d3SMartin Michlmayr .platform_data = &mv2120_led_data, 1802e1117d3SMartin Michlmayr } 1812e1117d3SMartin Michlmayr }; 1822e1117d3SMartin Michlmayr 183b08d5af3SMartin Michlmayr static void mv2120_power_off(void) 184b08d5af3SMartin Michlmayr { 185b08d5af3SMartin Michlmayr pr_info("%s: triggering power-off...\n", __func__); 186b08d5af3SMartin Michlmayr gpio_set_value(MV2120_GPIO_POWER_OFF, 0); 187b08d5af3SMartin Michlmayr } 188b08d5af3SMartin Michlmayr 189b08d5af3SMartin Michlmayr static void __init mv2120_init(void) 190b08d5af3SMartin Michlmayr { 191b08d5af3SMartin Michlmayr /* Setup basic Orion functions. Need to be called early. */ 192b08d5af3SMartin Michlmayr orion5x_init(); 193b08d5af3SMartin Michlmayr 194b08d5af3SMartin Michlmayr orion5x_mpp_conf(mv2120_mpp_modes); 195b08d5af3SMartin Michlmayr 196b08d5af3SMartin Michlmayr /* 197b08d5af3SMartin Michlmayr * Configure peripherals. 198b08d5af3SMartin Michlmayr */ 199b08d5af3SMartin Michlmayr orion5x_ehci0_init(); 200b08d5af3SMartin Michlmayr orion5x_ehci1_init(); 201b08d5af3SMartin Michlmayr orion5x_eth_init(&mv2120_eth_data); 202b08d5af3SMartin Michlmayr orion5x_i2c_init(); 203b08d5af3SMartin Michlmayr orion5x_sata_init(&mv2120_sata_data); 204b08d5af3SMartin Michlmayr orion5x_uart0_init(); 2051d5a1a6eSSaeed Bishara orion5x_xor_init(); 206b08d5af3SMartin Michlmayr 207b08d5af3SMartin Michlmayr orion5x_setup_dev_boot_win(MV2120_NOR_BOOT_BASE, MV2120_NOR_BOOT_SIZE); 208b08d5af3SMartin Michlmayr platform_device_register(&mv2120_nor_flash); 209b08d5af3SMartin Michlmayr 210b08d5af3SMartin Michlmayr platform_device_register(&mv2120_button_device); 211b08d5af3SMartin Michlmayr 212b08d5af3SMartin Michlmayr if (gpio_request(MV2120_GPIO_RTC_IRQ, "rtc") == 0) { 213b08d5af3SMartin Michlmayr if (gpio_direction_input(MV2120_GPIO_RTC_IRQ) == 0) 214b08d5af3SMartin Michlmayr mv2120_i2c_rtc.irq = gpio_to_irq(MV2120_GPIO_RTC_IRQ); 215b08d5af3SMartin Michlmayr else 216b08d5af3SMartin Michlmayr gpio_free(MV2120_GPIO_RTC_IRQ); 217b08d5af3SMartin Michlmayr } 218b08d5af3SMartin Michlmayr i2c_register_board_info(0, &mv2120_i2c_rtc, 1); 2192e1117d3SMartin Michlmayr platform_device_register(&mv2120_leds); 220b08d5af3SMartin Michlmayr 221b08d5af3SMartin Michlmayr /* register mv2120 specific power-off method */ 222b08d5af3SMartin Michlmayr if (gpio_request(MV2120_GPIO_POWER_OFF, "POWEROFF") != 0 || 223b08d5af3SMartin Michlmayr gpio_direction_output(MV2120_GPIO_POWER_OFF, 1) != 0) 224b08d5af3SMartin Michlmayr pr_err("mv2120: failed to setup power-off GPIO\n"); 225b08d5af3SMartin Michlmayr pm_power_off = mv2120_power_off; 226b08d5af3SMartin Michlmayr } 227b08d5af3SMartin Michlmayr 228b08d5af3SMartin Michlmayr /* Warning: HP uses a wrong mach-type (=526) in their bootloader */ 229b08d5af3SMartin Michlmayr MACHINE_START(MV2120, "HP Media Vault mv2120") 230b08d5af3SMartin Michlmayr /* Maintainer: Martin Michlmayr <tbm@cyrius.com> */ 23165aa1b1eSNicolas Pitre .atag_offset = 0x100, 232b08d5af3SMartin Michlmayr .init_machine = mv2120_init, 233b08d5af3SMartin Michlmayr .map_io = orion5x_map_io, 2344ee1f6b5SLennert Buytenhek .init_early = orion5x_init_early, 235b08d5af3SMartin Michlmayr .init_irq = orion5x_init_irq, 236b08d5af3SMartin Michlmayr .timer = &orion5x_timer, 237764cbcc2SRussell King .fixup = tag_fixup_mem32, 238764cbcc2SRussell King .restart = orion5x_restart, 239b08d5af3SMartin Michlmayr MACHINE_END 240