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