Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm
[linux-3.10.git] / arch / arm / mach-kirkwood / mv88f6281gtw_ge-setup.c
1 /*
2  * arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c
3  *
4  * Marvell 88F6281 GTW GE Board Setup
5  *
6  * This file is licensed under the terms of the GNU General Public
7  * License version 2.  This program is licensed "as is" without any
8  * warranty of any kind, whether express or implied.
9  */
10
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/platform_device.h>
14 #include <linux/pci.h>
15 #include <linux/irq.h>
16 #include <linux/mtd/physmap.h>
17 #include <linux/timer.h>
18 #include <linux/mv643xx_eth.h>
19 #include <linux/ethtool.h>
20 #include <linux/gpio.h>
21 #include <linux/leds.h>
22 #include <linux/input.h>
23 #include <linux/gpio_keys.h>
24 #include <linux/spi/flash.h>
25 #include <linux/spi/spi.h>
26 #include <linux/spi/orion_spi.h>
27 #include <net/dsa.h>
28 #include <asm/mach-types.h>
29 #include <asm/mach/arch.h>
30 #include <asm/mach/pci.h>
31 #include <mach/kirkwood.h>
32 #include "common.h"
33 #include "mpp.h"
34
35 static struct mv643xx_eth_platform_data mv88f6281gtw_ge_ge00_data = {
36         .phy_addr       = MV643XX_ETH_PHY_NONE,
37         .speed          = SPEED_1000,
38         .duplex         = DUPLEX_FULL,
39 };
40
41 static struct dsa_chip_data mv88f6281gtw_ge_switch_chip_data = {
42         .port_names[0]  = "lan1",
43         .port_names[1]  = "lan2",
44         .port_names[2]  = "lan3",
45         .port_names[3]  = "lan4",
46         .port_names[4]  = "wan",
47         .port_names[5]  = "cpu",
48 };
49
50 static struct dsa_platform_data mv88f6281gtw_ge_switch_plat_data = {
51         .nr_chips       = 1,
52         .chip           = &mv88f6281gtw_ge_switch_chip_data,
53 };
54
55 static const struct flash_platform_data mv88f6281gtw_ge_spi_slave_data = {
56         .type           = "mx25l12805d",
57 };
58
59 static struct spi_board_info __initdata mv88f6281gtw_ge_spi_slave_info[] = {
60         {
61                 .modalias       = "m25p80",
62                 .platform_data  = &mv88f6281gtw_ge_spi_slave_data,
63                 .irq            = -1,
64                 .max_speed_hz   = 50000000,
65                 .bus_num        = 0,
66                 .chip_select    = 0,
67         },
68 };
69
70 static struct gpio_keys_button mv88f6281gtw_ge_button_pins[] = {
71         {
72                 .code           = KEY_RESTART,
73                 .gpio           = 47,
74                 .desc           = "SWR Button",
75                 .active_low     = 1,
76         }, {
77                 .code           = KEY_WPS_BUTTON,
78                 .gpio           = 46,
79                 .desc           = "WPS Button",
80                 .active_low     = 1,
81         },
82 };
83
84 static struct gpio_keys_platform_data mv88f6281gtw_ge_button_data = {
85         .buttons        = mv88f6281gtw_ge_button_pins,
86         .nbuttons       = ARRAY_SIZE(mv88f6281gtw_ge_button_pins),
87 };
88
89 static struct platform_device mv88f6281gtw_ge_buttons = {
90         .name           = "gpio-keys",
91         .id             = -1,
92         .num_resources  = 0,
93         .dev            = {
94                 .platform_data  = &mv88f6281gtw_ge_button_data,
95         },
96 };
97
98 static struct gpio_led mv88f6281gtw_ge_led_pins[] = {
99         {
100                 .name           = "gtw:green:Status",
101                 .gpio           = 20,
102                 .active_low     = 0,
103         }, {
104                 .name           = "gtw:red:Status",
105                 .gpio           = 21,
106                 .active_low     = 0,
107         }, {
108                 .name           = "gtw:green:USB",
109                 .gpio           = 12,
110                 .active_low     = 0,
111         },
112 };
113
114 static struct gpio_led_platform_data mv88f6281gtw_ge_led_data = {
115         .leds           = mv88f6281gtw_ge_led_pins,
116         .num_leds       = ARRAY_SIZE(mv88f6281gtw_ge_led_pins),
117 };
118
119 static struct platform_device mv88f6281gtw_ge_leds = {
120         .name   = "leds-gpio",
121         .id     = -1,
122         .dev    = {
123                 .platform_data  = &mv88f6281gtw_ge_led_data,
124         },
125 };
126
127 static unsigned int mv88f6281gtw_ge_mpp_config[] __initdata = {
128         MPP12_GPO,      /* Status#_USB pin  */
129         MPP20_GPIO,     /* Status#_GLED pin */
130         MPP21_GPIO,     /* Status#_RLED pin */
131         MPP46_GPIO,     /* WPS_Switch pin   */
132         MPP47_GPIO,     /* SW_Init pin      */
133         0
134 };
135
136 static void __init mv88f6281gtw_ge_init(void)
137 {
138         /*
139          * Basic setup. Needs to be called early.
140          */
141         kirkwood_init();
142         kirkwood_mpp_conf(mv88f6281gtw_ge_mpp_config);
143
144         kirkwood_ehci_init();
145         kirkwood_ge00_init(&mv88f6281gtw_ge_ge00_data);
146         kirkwood_ge00_switch_init(&mv88f6281gtw_ge_switch_plat_data, NO_IRQ);
147         spi_register_board_info(mv88f6281gtw_ge_spi_slave_info,
148                                 ARRAY_SIZE(mv88f6281gtw_ge_spi_slave_info));
149         kirkwood_spi_init();
150         kirkwood_uart0_init();
151         platform_device_register(&mv88f6281gtw_ge_leds);
152         platform_device_register(&mv88f6281gtw_ge_buttons);
153 }
154
155 static int __init mv88f6281gtw_ge_pci_init(void)
156 {
157         if (machine_is_mv88f6281gtw_ge())
158                 kirkwood_pcie_init(KW_PCIE0);
159
160         return 0;
161 }
162 subsys_initcall(mv88f6281gtw_ge_pci_init);
163
164 MACHINE_START(MV88F6281GTW_GE, "Marvell 88F6281 GTW GE Board")
165         /* Maintainer: Lennert Buytenhek <buytenh@marvell.com> */
166         .boot_params    = 0x00000100,
167         .init_machine   = mv88f6281gtw_ge_init,
168         .map_io         = kirkwood_map_io,
169         .init_early     = kirkwood_init_early,
170         .init_irq       = kirkwood_init_irq,
171         .timer          = &kirkwood_timer,
172 MACHINE_END