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