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>
24b08d5af3SMartin Michlmayr #include "common.h"
25b08d5af3SMartin Michlmayr #include "mpp.h"
26c22c2c60SArnd Bergmann #include "orion5x.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
mv2120_power_off(void)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
mv2120_init(void)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
2074ca2c040SThomas Petazzoni mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
2084ca2c040SThomas Petazzoni ORION_MBUS_DEVBUS_BOOT_ATTR,
2094ca2c040SThomas Petazzoni MV2120_NOR_BOOT_BASE,
2105d1190eaSThomas Petazzoni MV2120_NOR_BOOT_SIZE);
211b08d5af3SMartin Michlmayr platform_device_register(&mv2120_nor_flash);
212b08d5af3SMartin Michlmayr
213b08d5af3SMartin Michlmayr platform_device_register(&mv2120_button_device);
214b08d5af3SMartin Michlmayr
215b08d5af3SMartin Michlmayr if (gpio_request(MV2120_GPIO_RTC_IRQ, "rtc") == 0) {
216b08d5af3SMartin Michlmayr if (gpio_direction_input(MV2120_GPIO_RTC_IRQ) == 0)
217b08d5af3SMartin Michlmayr mv2120_i2c_rtc.irq = gpio_to_irq(MV2120_GPIO_RTC_IRQ);
218b08d5af3SMartin Michlmayr else
219b08d5af3SMartin Michlmayr gpio_free(MV2120_GPIO_RTC_IRQ);
220b08d5af3SMartin Michlmayr }
221b08d5af3SMartin Michlmayr i2c_register_board_info(0, &mv2120_i2c_rtc, 1);
2222e1117d3SMartin Michlmayr platform_device_register(&mv2120_leds);
223b08d5af3SMartin Michlmayr
224b08d5af3SMartin Michlmayr /* register mv2120 specific power-off method */
225b08d5af3SMartin Michlmayr if (gpio_request(MV2120_GPIO_POWER_OFF, "POWEROFF") != 0 ||
226b08d5af3SMartin Michlmayr gpio_direction_output(MV2120_GPIO_POWER_OFF, 1) != 0)
227b08d5af3SMartin Michlmayr pr_err("mv2120: failed to setup power-off GPIO\n");
228b08d5af3SMartin Michlmayr pm_power_off = mv2120_power_off;
229b08d5af3SMartin Michlmayr }
230b08d5af3SMartin Michlmayr
231b08d5af3SMartin Michlmayr /* Warning: HP uses a wrong mach-type (=526) in their bootloader */
232b08d5af3SMartin Michlmayr MACHINE_START(MV2120, "HP Media Vault mv2120")
233b08d5af3SMartin Michlmayr /* Maintainer: Martin Michlmayr <tbm@cyrius.com> */
23465aa1b1eSNicolas Pitre .atag_offset = 0x100,
2355cdbe5d2SArnd Bergmann .nr_irqs = ORION5X_NR_IRQS,
236b08d5af3SMartin Michlmayr .init_machine = mv2120_init,
237b08d5af3SMartin Michlmayr .map_io = orion5x_map_io,
2384ee1f6b5SLennert Buytenhek .init_early = orion5x_init_early,
239b08d5af3SMartin Michlmayr .init_irq = orion5x_init_irq,
2406bb27d73SStephen Warren .init_time = orion5x_timer_init,
241764cbcc2SRussell King .fixup = tag_fixup_mem32,
242764cbcc2SRussell King .restart = orion5x_restart,
243b08d5af3SMartin Michlmayr MACHINE_END
244