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