Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ecryptfs...
[sfrench/cifs-2.6.git] / arch / arm / mach-kirkwood / netxbig_v2-setup.c
1 /*
2  * arch/arm/mach-kirkwood/netxbig_v2-setup.c
3  *
4  * LaCie 2Big and 5Big Network v2 board setup
5  *
6  * Copyright (C) 2010 Simon Guinot <sguinot@lacie.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
22
23 #include <linux/kernel.h>
24 #include <linux/init.h>
25 #include <linux/platform_device.h>
26 #include <linux/mtd/physmap.h>
27 #include <linux/spi/flash.h>
28 #include <linux/spi/spi.h>
29 #include <linux/ata_platform.h>
30 #include <linux/mv643xx_eth.h>
31 #include <linux/i2c.h>
32 #include <linux/i2c/at24.h>
33 #include <linux/input.h>
34 #include <linux/gpio.h>
35 #include <linux/gpio_keys.h>
36 #include <linux/leds.h>
37 #include <asm/mach-types.h>
38 #include <asm/mach/arch.h>
39 #include <asm/mach/time.h>
40 #include <mach/kirkwood.h>
41 #include <plat/time.h>
42 #include "common.h"
43 #include "mpp.h"
44
45 /*****************************************************************************
46  * 512KB SPI Flash on Boot Device (MACRONIX MX25L4005)
47  ****************************************************************************/
48
49 static struct mtd_partition netxbig_v2_flash_parts[] = {
50         {
51                 .name = "u-boot",
52                 .size = MTDPART_SIZ_FULL,
53                 .offset = 0,
54                 .mask_flags = MTD_WRITEABLE, /* force read-only */
55         },
56 };
57
58 static const struct flash_platform_data netxbig_v2_flash = {
59         .type           = "mx25l4005a",
60         .name           = "spi_flash",
61         .parts          = netxbig_v2_flash_parts,
62         .nr_parts       = ARRAY_SIZE(netxbig_v2_flash_parts),
63 };
64
65 static struct spi_board_info __initdata netxbig_v2_spi_slave_info[] = {
66         {
67                 .modalias       = "m25p80",
68                 .platform_data  = &netxbig_v2_flash,
69                 .irq            = -1,
70                 .max_speed_hz   = 20000000,
71                 .bus_num        = 0,
72                 .chip_select    = 0,
73         },
74 };
75
76 /*****************************************************************************
77  * Ethernet
78  ****************************************************************************/
79
80 static struct mv643xx_eth_platform_data netxbig_v2_ge00_data = {
81         .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
82 };
83
84 static struct mv643xx_eth_platform_data netxbig_v2_ge01_data = {
85         .phy_addr       = MV643XX_ETH_PHY_ADDR(0),
86 };
87
88 /*****************************************************************************
89  * I2C devices
90  ****************************************************************************/
91
92 static struct at24_platform_data at24c04 = {
93         .byte_len       = SZ_4K / 8,
94         .page_size      = 16,
95 };
96
97 /*
98  * i2c addr | chip         | description
99  * 0x50     | HT24LC04     | eeprom (512B)
100  */
101
102 static struct i2c_board_info __initdata netxbig_v2_i2c_info[] = {
103         {
104                 I2C_BOARD_INFO("24c04", 0x50),
105                 .platform_data  = &at24c04,
106         }
107 };
108
109 /*****************************************************************************
110  * SATA
111  ****************************************************************************/
112
113 static struct mv_sata_platform_data netxbig_v2_sata_data = {
114         .n_ports        = 2,
115 };
116
117 static int __initdata netxbig_v2_gpio_hdd_power[] = { 16, 17, 41, 42, 43 };
118
119 static void __init netxbig_v2_sata_power_init(void)
120 {
121         int i;
122         int err;
123         int hdd_nb;
124
125         if (machine_is_net2big_v2())
126                 hdd_nb = 2;
127         else
128                 hdd_nb = 5;
129
130         /* Power up all hard disks. */
131         for (i = 0; i < hdd_nb; i++) {
132                 err = gpio_request(netxbig_v2_gpio_hdd_power[i], NULL);
133                 if (err == 0) {
134                         err = gpio_direction_output(
135                                         netxbig_v2_gpio_hdd_power[i], 1);
136                         /* Free the HDD power GPIOs. This allow user-space to
137                          * configure them via the gpiolib sysfs interface. */
138                         gpio_free(netxbig_v2_gpio_hdd_power[i]);
139                 }
140                 if (err)
141                         pr_err("netxbig_v2: failed to power up HDD%d\n", i + 1);
142         }
143 }
144
145 /*****************************************************************************
146  * GPIO keys
147  ****************************************************************************/
148
149 #define NETXBIG_V2_GPIO_SWITCH_POWER_ON         13
150 #define NETXBIG_V2_GPIO_SWITCH_POWER_OFF        15
151 #define NETXBIG_V2_GPIO_FUNC_BUTTON             34
152
153 #define NETXBIG_V2_SWITCH_POWER_ON              0x1
154 #define NETXBIG_V2_SWITCH_POWER_OFF             0x2
155
156 static struct gpio_keys_button netxbig_v2_buttons[] = {
157         [0] = {
158                 .type           = EV_SW,
159                 .code           = NETXBIG_V2_SWITCH_POWER_ON,
160                 .gpio           = NETXBIG_V2_GPIO_SWITCH_POWER_ON,
161                 .desc           = "Back power switch (on|auto)",
162                 .active_low     = 1,
163         },
164         [1] = {
165                 .type           = EV_SW,
166                 .code           = NETXBIG_V2_SWITCH_POWER_OFF,
167                 .gpio           = NETXBIG_V2_GPIO_SWITCH_POWER_OFF,
168                 .desc           = "Back power switch (auto|off)",
169                 .active_low     = 1,
170         },
171         [2] = {
172                 .code           = KEY_OPTION,
173                 .gpio           = NETXBIG_V2_GPIO_FUNC_BUTTON,
174                 .desc           = "Function button",
175                 .active_low     = 1,
176         },
177 };
178
179 static struct gpio_keys_platform_data netxbig_v2_button_data = {
180         .buttons        = netxbig_v2_buttons,
181         .nbuttons       = ARRAY_SIZE(netxbig_v2_buttons),
182 };
183
184 static struct platform_device netxbig_v2_gpio_buttons = {
185         .name           = "gpio-keys",
186         .id             = -1,
187         .dev            = {
188                 .platform_data  = &netxbig_v2_button_data,
189         },
190 };
191
192 /*****************************************************************************
193  * GPIO LEDs
194  ****************************************************************************/
195
196 /*
197  * The LEDs are controlled by a CPLD and can be configured through a GPIO
198  * extension bus:
199  *
200  * - address register : bit [0-2] -> GPIO [47-49]
201  * - data register    : bit [0-2] -> GPIO [44-46]
202  * - enable register  : GPIO 29
203  *
204  * Address register selection:
205  *
206  * addr | register
207  * ----------------------------
208  *   0  | front LED
209  *   1  | front LED brightness
210  *   2  | HDD LED brightness
211  *   3  | HDD1 LED
212  *   4  | HDD2 LED
213  *   5  | HDD3 LED
214  *   6  | HDD4 LED
215  *   7  | HDD5 LED
216  *
217  * Data register configuration:
218  *
219  * data | LED brightness
220  * -------------------------------------------------
221  *   0  | min (off)
222  *   -  | -
223  *   7  | max
224  *
225  * data | front LED mode
226  * -------------------------------------------------
227  *   0  | fix off
228  *   1  | fix blue on
229  *   2  | fix red on
230  *   3  | blink blue on=1 sec and blue off=1 sec
231  *   4  | blink red on=1 sec and red off=1 sec
232  *   5  | blink blue on=2.5 sec and red on=0.5 sec
233  *   6  | blink blue on=1 sec and red on=1 sec
234  *   7  | blink blue on=0.5 sec and blue off=2.5 sec
235  *
236  * data | HDD LED mode
237  * -------------------------------------------------
238  *   0  | fix blue on
239  *   1  | SATA activity blink
240  *   2  | fix red on
241  *   3  | blink blue on=1 sec and blue off=1 sec
242  *   4  | blink red on=1 sec and red off=1 sec
243  *   5  | blink blue on=2.5 sec and red on=0.5 sec
244  *   6  | blink blue on=1 sec and red on=1 sec
245  *   7  | blink blue on=0.5 sec and blue off=2.5 sec
246  */
247
248 /*****************************************************************************
249  * Timer
250  ****************************************************************************/
251
252 static void netxbig_v2_timer_init(void)
253 {
254         kirkwood_tclk = 166666667;
255         orion_time_init(IRQ_KIRKWOOD_BRIDGE, kirkwood_tclk);
256 }
257
258 struct sys_timer netxbig_v2_timer = {
259         .init = netxbig_v2_timer_init,
260 };
261
262 /*****************************************************************************
263  * General Setup
264  ****************************************************************************/
265
266 static unsigned int net2big_v2_mpp_config[] __initdata = {
267         MPP0_SPI_SCn,
268         MPP1_SPI_MOSI,
269         MPP2_SPI_SCK,
270         MPP3_SPI_MISO,
271         MPP6_SYSRST_OUTn,
272         MPP7_GPO,               /* Request power-off */
273         MPP8_TW0_SDA,
274         MPP9_TW0_SCK,
275         MPP10_UART0_TXD,
276         MPP11_UART0_RXD,
277         MPP13_GPIO,             /* Rear power switch (on|auto) */
278         MPP14_GPIO,             /* USB fuse alarm */
279         MPP15_GPIO,             /* Rear power switch (auto|off) */
280         MPP16_GPIO,             /* SATA HDD1 power */
281         MPP17_GPIO,             /* SATA HDD2 power */
282         MPP20_SATA1_ACTn,
283         MPP21_SATA0_ACTn,
284         MPP24_GPIO,             /* USB mode select */
285         MPP26_GPIO,             /* USB device vbus */
286         MPP28_GPIO,             /* USB enable host vbus */
287         MPP29_GPIO,             /* CPLD extension ALE */
288         MPP34_GPIO,             /* Rear Push button */
289         MPP35_GPIO,             /* Inhibit switch power-off */
290         MPP36_GPIO,             /* SATA HDD1 presence */
291         MPP37_GPIO,             /* SATA HDD2 presence */
292         MPP40_GPIO,             /* eSATA presence */
293         MPP44_GPIO,             /* CPLD extension (data 0) */
294         MPP45_GPIO,             /* CPLD extension (data 1) */
295         MPP46_GPIO,             /* CPLD extension (data 2) */
296         MPP47_GPIO,             /* CPLD extension (addr 0) */
297         MPP48_GPIO,             /* CPLD extension (addr 1) */
298         MPP49_GPIO,             /* CPLD extension (addr 2) */
299         0
300 };
301
302 static unsigned int net5big_v2_mpp_config[] __initdata = {
303         MPP0_SPI_SCn,
304         MPP1_SPI_MOSI,
305         MPP2_SPI_SCK,
306         MPP3_SPI_MISO,
307         MPP6_SYSRST_OUTn,
308         MPP7_GPO,               /* Request power-off */
309         MPP8_TW0_SDA,
310         MPP9_TW0_SCK,
311         MPP10_UART0_TXD,
312         MPP11_UART0_RXD,
313         MPP13_GPIO,             /* Rear power switch (on|auto) */
314         MPP14_GPIO,             /* USB fuse alarm */
315         MPP15_GPIO,             /* Rear power switch (auto|off) */
316         MPP16_GPIO,             /* SATA HDD1 power */
317         MPP17_GPIO,             /* SATA HDD2 power */
318         MPP20_GE1_TXD0,
319         MPP21_GE1_TXD1,
320         MPP22_GE1_TXD2,
321         MPP23_GE1_TXD3,
322         MPP24_GE1_RXD0,
323         MPP25_GE1_RXD1,
324         MPP26_GE1_RXD2,
325         MPP27_GE1_RXD3,
326         MPP28_GPIO,             /* USB enable host vbus */
327         MPP29_GPIO,             /* CPLD extension ALE */
328         MPP30_GE1_RXCTL,
329         MPP31_GE1_RXCLK,
330         MPP32_GE1_TCLKOUT,
331         MPP33_GE1_TXCTL,
332         MPP34_GPIO,             /* Rear Push button */
333         MPP35_GPIO,             /* Inhibit switch power-off */
334         MPP36_GPIO,             /* SATA HDD1 presence */
335         MPP37_GPIO,             /* SATA HDD2 presence */
336         MPP38_GPIO,             /* SATA HDD3 presence */
337         MPP39_GPIO,             /* SATA HDD4 presence */
338         MPP40_GPIO,             /* SATA HDD5 presence */
339         MPP41_GPIO,             /* SATA HDD3 power */
340         MPP42_GPIO,             /* SATA HDD4 power */
341         MPP43_GPIO,             /* SATA HDD5 power */
342         MPP44_GPIO,             /* CPLD extension (data 0) */
343         MPP45_GPIO,             /* CPLD extension (data 1) */
344         MPP46_GPIO,             /* CPLD extension (data 2) */
345         MPP47_GPIO,             /* CPLD extension (addr 0) */
346         MPP48_GPIO,             /* CPLD extension (addr 1) */
347         MPP49_GPIO,             /* CPLD extension (addr 2) */
348         0
349 };
350
351 #define NETXBIG_V2_GPIO_POWER_OFF               7
352
353 static void netxbig_v2_power_off(void)
354 {
355         gpio_set_value(NETXBIG_V2_GPIO_POWER_OFF, 1);
356 }
357
358 static void __init netxbig_v2_init(void)
359 {
360         /*
361          * Basic setup. Needs to be called early.
362          */
363         kirkwood_init();
364         if (machine_is_net2big_v2())
365                 kirkwood_mpp_conf(net2big_v2_mpp_config);
366         else
367                 kirkwood_mpp_conf(net5big_v2_mpp_config);
368
369         netxbig_v2_sata_power_init();
370
371         kirkwood_ehci_init();
372         kirkwood_ge00_init(&netxbig_v2_ge00_data);
373         if (machine_is_net5big_v2())
374                 kirkwood_ge01_init(&netxbig_v2_ge01_data);
375         kirkwood_sata_init(&netxbig_v2_sata_data);
376         kirkwood_uart0_init();
377         spi_register_board_info(netxbig_v2_spi_slave_info,
378                                 ARRAY_SIZE(netxbig_v2_spi_slave_info));
379         kirkwood_spi_init();
380         kirkwood_i2c_init();
381         i2c_register_board_info(0, netxbig_v2_i2c_info,
382                                 ARRAY_SIZE(netxbig_v2_i2c_info));
383
384         platform_device_register(&netxbig_v2_gpio_buttons);
385
386         if (gpio_request(NETXBIG_V2_GPIO_POWER_OFF, "power-off") == 0 &&
387             gpio_direction_output(NETXBIG_V2_GPIO_POWER_OFF, 0) == 0)
388                 pm_power_off = netxbig_v2_power_off;
389         else
390                 pr_err("netxbig_v2: failed to configure power-off GPIO\n");
391 }
392
393 #ifdef CONFIG_MACH_NET2BIG_V2
394 MACHINE_START(NET2BIG_V2, "LaCie 2Big Network v2")
395         .phys_io        = KIRKWOOD_REGS_PHYS_BASE,
396         .io_pg_offst    = ((KIRKWOOD_REGS_VIRT_BASE) >> 18) & 0xfffc,
397         .boot_params    = 0x00000100,
398         .init_machine   = netxbig_v2_init,
399         .map_io         = kirkwood_map_io,
400         .init_irq       = kirkwood_init_irq,
401         .timer          = &netxbig_v2_timer,
402 MACHINE_END
403 #endif
404
405 #ifdef CONFIG_MACH_NET5BIG_V2
406 MACHINE_START(NET5BIG_V2, "LaCie 5Big Network v2")
407         .phys_io        = KIRKWOOD_REGS_PHYS_BASE,
408         .io_pg_offst    = ((KIRKWOOD_REGS_VIRT_BASE) >> 18) & 0xfffc,
409         .boot_params    = 0x00000100,
410         .init_machine   = netxbig_v2_init,
411         .map_io         = kirkwood_map_io,
412         .init_irq       = kirkwood_init_irq,
413         .timer          = &netxbig_v2_timer,
414 MACHINE_END
415 #endif