Merge branches 'fixes' and 'fixes2' into devel-late
[pandora-kernel.git] / arch / arm / mach-at91 / board-gsia18s.c
1 /*
2  *  Copyright (C) 2010 Christian Glindkamp <christian.glindkamp@taskit.de>
3  *                     taskit GmbH
4  *                2010 Igor Plyatov <plyatov@gmail.com>
5  *                     GeoSIG Ltd
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21
22 #include <linux/platform_device.h>
23 #include <linux/gpio.h>
24 #include <linux/w1-gpio.h>
25 #include <linux/i2c.h>
26 #include <linux/i2c/pcf857x.h>
27 #include <linux/gpio_keys.h>
28 #include <linux/input.h>
29
30 #include <asm/mach-types.h>
31 #include <asm/mach/arch.h>
32
33 #include <mach/board.h>
34 #include <mach/at91sam9_smc.h>
35 #include <mach/gsia18s.h>
36 #include <mach/stamp9g20.h>
37
38 #include "sam9_smc.h"
39 #include "generic.h"
40
41 static void __init gsia18s_init_early(void)
42 {
43         stamp9g20_init_early();
44 }
45
46 /*
47  * Two USB Host ports
48  */
49 static struct at91_usbh_data __initdata usbh_data = {
50         .ports          = 2,
51         .vbus_pin       = {-EINVAL, -EINVAL},
52         .overcurrent_pin= {-EINVAL, -EINVAL},
53 };
54
55 /*
56  * USB Device port
57  */
58 static struct at91_udc_data __initdata udc_data = {
59         .vbus_pin       = AT91_PIN_PA22,
60         .pullup_pin     = -EINVAL,              /* pull-up driven by UDC */
61 };
62
63 /*
64  * MACB Ethernet device
65  */
66 static struct macb_platform_data __initdata macb_data = {
67         .phy_irq_pin    = AT91_PIN_PA28,
68         .is_rmii        = 1,
69 };
70
71 /*
72  * LEDs and GPOs
73  */
74 static struct gpio_led gpio_leds[] = {
75         {
76                 .name                   = "gpo:spi1reset",
77                 .gpio                   = AT91_PIN_PC1,
78                 .active_low             = 0,
79                 .default_trigger        = "none",
80                 .default_state          = LEDS_GPIO_DEFSTATE_OFF,
81         },
82         {
83                 .name                   = "gpo:trig_net_out",
84                 .gpio                   = AT91_PIN_PB20,
85                 .active_low             = 0,
86                 .default_trigger        = "none",
87                 .default_state          = LEDS_GPIO_DEFSTATE_OFF,
88         },
89         {
90                 .name                   = "gpo:trig_net_dir",
91                 .gpio                   = AT91_PIN_PB19,
92                 .active_low             = 0,
93                 .default_trigger        = "none",
94                 .default_state          = LEDS_GPIO_DEFSTATE_OFF,
95         },
96         {
97                 .name                   = "gpo:charge_dis",
98                 .gpio                   = AT91_PIN_PC2,
99                 .active_low             = 0,
100                 .default_trigger        = "none",
101                 .default_state          = LEDS_GPIO_DEFSTATE_OFF,
102         },
103         {
104                 .name                   = "led:event",
105                 .gpio                   = AT91_PIN_PB17,
106                 .active_low             = 1,
107                 .default_trigger        = "none",
108                 .default_state          = LEDS_GPIO_DEFSTATE_OFF,
109         },
110         {
111                 .name                   = "led:lan",
112                 .gpio                   = AT91_PIN_PB18,
113                 .active_low             = 1,
114                 .default_trigger        = "none",
115                 .default_state          = LEDS_GPIO_DEFSTATE_OFF,
116         },
117         {
118                 .name                   = "led:error",
119                 .gpio                   = AT91_PIN_PB16,
120                 .active_low             = 1,
121                 .default_trigger        = "none",
122                 .default_state          = LEDS_GPIO_DEFSTATE_ON,
123         }
124 };
125
126 static struct gpio_led_platform_data gpio_led_info = {
127         .leds           = gpio_leds,
128         .num_leds       = ARRAY_SIZE(gpio_leds),
129 };
130
131 static struct platform_device leds = {
132         .name   = "leds-gpio",
133         .id     = 0,
134         .dev    = {
135                 .platform_data  = &gpio_led_info,
136         }
137 };
138
139 static void __init gsia18s_leds_init(void)
140 {
141         platform_device_register(&leds);
142 }
143
144 /* PCF8574 0x20 GPIO - U1 on the GS_IA18-CB_V3 board */
145 static struct gpio_led pcf_gpio_leds1[] = {
146         { /* bit 0 */
147                 .name                   = "gpo:hdc_power",
148                 .gpio                   = PCF_GPIO_HDC_POWER,
149                 .active_low             = 0,
150                 .default_trigger        = "none",
151                 .default_state          = LEDS_GPIO_DEFSTATE_OFF,
152         },
153         { /* bit 1 */
154                 .name                   = "gpo:wifi_setup",
155                 .gpio                   = PCF_GPIO_WIFI_SETUP,
156                 .active_low             = 1,
157                 .default_trigger        = "none",
158                 .default_state          = LEDS_GPIO_DEFSTATE_OFF,
159         },
160         { /* bit 2 */
161                 .name                   = "gpo:wifi_enable",
162                 .gpio                   = PCF_GPIO_WIFI_ENABLE,
163                 .active_low             = 1,
164                 .default_trigger        = "none",
165                 .default_state          = LEDS_GPIO_DEFSTATE_OFF,
166         },
167         { /* bit 3      */
168                 .name                   = "gpo:wifi_reset",
169                 .gpio                   = PCF_GPIO_WIFI_RESET,
170                 .active_low             = 1,
171                 .default_trigger        = "none",
172                 .default_state          = LEDS_GPIO_DEFSTATE_ON,
173         },
174         /* bit 4 used as GPI    */
175         { /* bit 5 */
176                 .name                   = "gpo:gps_setup",
177                 .gpio                   = PCF_GPIO_GPS_SETUP,
178                 .active_low             = 1,
179                 .default_trigger        = "none",
180                 .default_state          = LEDS_GPIO_DEFSTATE_OFF,
181         },
182         { /* bit 6 */
183                 .name                   = "gpo:gps_standby",
184                 .gpio                   = PCF_GPIO_GPS_STANDBY,
185                 .active_low             = 0,
186                 .default_trigger        = "none",
187                 .default_state          = LEDS_GPIO_DEFSTATE_ON,
188         },
189         { /* bit 7 */
190                 .name                   = "gpo:gps_power",
191                 .gpio                   = PCF_GPIO_GPS_POWER,
192                 .active_low             = 0,
193                 .default_trigger        = "none",
194                 .default_state          = LEDS_GPIO_DEFSTATE_OFF,
195         }
196 };
197
198 static struct gpio_led_platform_data pcf_gpio_led_info1 = {
199         .leds           = pcf_gpio_leds1,
200         .num_leds       = ARRAY_SIZE(pcf_gpio_leds1),
201 };
202
203 static struct platform_device pcf_leds1 = {
204         .name   = "leds-gpio", /* GS_IA18-CB_board */
205         .id     = 1,
206         .dev    = {
207                 .platform_data  = &pcf_gpio_led_info1,
208         }
209 };
210
211 /* PCF8574 0x22 GPIO - U1 on the GS_2G_OPT1-A_V0 board (Alarm) */
212 static struct gpio_led pcf_gpio_leds2[] = {
213         { /* bit 0 */
214                 .name                   = "gpo:alarm_1",
215                 .gpio                   = PCF_GPIO_ALARM1,
216                 .active_low             = 1,
217                 .default_trigger        = "none",
218                 .default_state          = LEDS_GPIO_DEFSTATE_OFF,
219         },
220         { /* bit 1 */
221                 .name                   = "gpo:alarm_2",
222                 .gpio                   = PCF_GPIO_ALARM2,
223                 .active_low             = 1,
224                 .default_trigger        = "none",
225                 .default_state          = LEDS_GPIO_DEFSTATE_OFF,
226         },
227         { /* bit 2 */
228                 .name                   = "gpo:alarm_3",
229                 .gpio                   = PCF_GPIO_ALARM3,
230                 .active_low             = 1,
231                 .default_trigger        = "none",
232                 .default_state          = LEDS_GPIO_DEFSTATE_OFF,
233         },
234         { /* bit 3 */
235                 .name                   = "gpo:alarm_4",
236                 .gpio                   = PCF_GPIO_ALARM4,
237                 .active_low             = 1,
238                 .default_trigger        = "none",
239                 .default_state          = LEDS_GPIO_DEFSTATE_OFF,
240         },
241         /* bits 4, 5, 6 not used */
242         { /* bit 7 */
243                 .name                   = "gpo:alarm_v_relay_on",
244                 .gpio                   = PCF_GPIO_ALARM_V_RELAY_ON,
245                 .active_low             = 0,
246                 .default_trigger        = "none",
247                 .default_state          = LEDS_GPIO_DEFSTATE_OFF,
248         },
249 };
250
251 static struct gpio_led_platform_data pcf_gpio_led_info2 = {
252         .leds           = pcf_gpio_leds2,
253         .num_leds       = ARRAY_SIZE(pcf_gpio_leds2),
254 };
255
256 static struct platform_device pcf_leds2 = {
257         .name   = "leds-gpio",
258         .id     = 2,
259         .dev    = {
260                 .platform_data  = &pcf_gpio_led_info2,
261         }
262 };
263
264 /* PCF8574 0x24 GPIO U1 on the GS_2G-OPT23-A_V0 board (Modem) */
265 static struct gpio_led pcf_gpio_leds3[] = {
266         { /* bit 0 */
267                 .name                   = "gpo:modem_power",
268                 .gpio                   = PCF_GPIO_MODEM_POWER,
269                 .active_low             = 1,
270                 .default_trigger        = "none",
271                 .default_state          = LEDS_GPIO_DEFSTATE_OFF,
272         },
273                 /* bits 1 and 2 not used */
274         { /* bit 3 */
275                 .name                   = "gpo:modem_reset",
276                 .gpio                   = PCF_GPIO_MODEM_RESET,
277                 .active_low             = 1,
278                 .default_trigger        = "none",
279                 .default_state          = LEDS_GPIO_DEFSTATE_ON,
280         },
281                 /* bits 4, 5 and 6 not used */
282         { /* bit 7 */
283                 .name                   = "gpo:trx_reset",
284                 .gpio                   = PCF_GPIO_TRX_RESET,
285                 .active_low             = 1,
286                 .default_trigger        = "none",
287                 .default_state          = LEDS_GPIO_DEFSTATE_ON,
288         }
289 };
290
291 static struct gpio_led_platform_data pcf_gpio_led_info3 = {
292         .leds           = pcf_gpio_leds3,
293         .num_leds       = ARRAY_SIZE(pcf_gpio_leds3),
294 };
295
296 static struct platform_device pcf_leds3 = {
297         .name   = "leds-gpio",
298         .id     = 3,
299         .dev    = {
300                 .platform_data  = &pcf_gpio_led_info3,
301         }
302 };
303
304 static void __init gsia18s_pcf_leds_init(void)
305 {
306         platform_device_register(&pcf_leds1);
307         platform_device_register(&pcf_leds2);
308         platform_device_register(&pcf_leds3);
309 }
310
311 /*
312  * SPI busses.
313  */
314 static struct spi_board_info gsia18s_spi_devices[] = {
315         { /* User accessible spi0, cs0 used for communication with MSP RTC */
316                 .modalias       = "spidev",
317                 .bus_num        = 0,
318                 .chip_select    = 0,
319                 .max_speed_hz   = 580000,
320                 .mode           = SPI_MODE_1,
321         },
322         { /* User accessible spi1, cs0 used for communication with int. DSP */
323                 .modalias       = "spidev",
324                 .bus_num        = 1,
325                 .chip_select    = 0,
326                 .max_speed_hz   = 5600000,
327                 .mode           = SPI_MODE_0,
328         },
329         { /* User accessible spi1, cs1 used for communication with ext. DSP */
330                 .modalias       = "spidev",
331                 .bus_num        = 1,
332                 .chip_select    = 1,
333                 .max_speed_hz   = 5600000,
334                 .mode           = SPI_MODE_0,
335         },
336         { /* User accessible spi1, cs2 used for communication with ext. DSP */
337                 .modalias       = "spidev",
338                 .bus_num        = 1,
339                 .chip_select    = 2,
340                 .max_speed_hz   = 5600000,
341                 .mode           = SPI_MODE_0,
342         },
343         { /* User accessible spi1, cs3 used for communication with ext. DSP */
344                 .modalias       = "spidev",
345                 .bus_num        = 1,
346                 .chip_select    = 3,
347                 .max_speed_hz   = 5600000,
348                 .mode           = SPI_MODE_0,
349         }
350 };
351
352 /*
353  * GPI Buttons
354  */
355 static struct gpio_keys_button buttons[] = {
356         {
357                 .gpio           = GPIO_TRIG_NET_IN,
358                 .code           = BTN_1,
359                 .desc           = "TRIG_NET_IN",
360                 .type           = EV_KEY,
361                 .active_low     = 0,
362                 .wakeup         = 1,
363         },
364         { /* SW80 on the GS_IA18_S-MN board*/
365                 .gpio           = GPIO_CARD_UNMOUNT_0,
366                 .code           = BTN_2,
367                 .desc           = "Card umount 0",
368                 .type           = EV_KEY,
369                 .active_low     = 1,
370                 .wakeup         = 1,
371         },
372         { /* SW79 on the GS_IA18_S-MN board*/
373                 .gpio           = GPIO_CARD_UNMOUNT_1,
374                 .code           = BTN_3,
375                 .desc           = "Card umount 1",
376                 .type           = EV_KEY,
377                 .active_low     = 1,
378                 .wakeup         = 1,
379         },
380         { /* SW280 on the GS_IA18-CB board*/
381                 .gpio           = GPIO_KEY_POWER,
382                 .code           = KEY_POWER,
383                 .desc           = "Power Off Button",
384                 .type           = EV_KEY,
385                 .active_low     = 0,
386                 .wakeup         = 1,
387         }
388 };
389
390 static struct gpio_keys_platform_data button_data = {
391         .buttons        = buttons,
392         .nbuttons       = ARRAY_SIZE(buttons),
393 };
394
395 static struct platform_device button_device = {
396         .name           = "gpio-keys",
397         .id             = -1,
398         .num_resources  = 0,
399         .dev            = {
400                 .platform_data  = &button_data,
401         }
402 };
403
404 static void __init gsia18s_add_device_buttons(void)
405 {
406         at91_set_gpio_input(GPIO_TRIG_NET_IN, 1);
407         at91_set_deglitch(GPIO_TRIG_NET_IN, 1);
408         at91_set_gpio_input(GPIO_CARD_UNMOUNT_0, 1);
409         at91_set_deglitch(GPIO_CARD_UNMOUNT_0, 1);
410         at91_set_gpio_input(GPIO_CARD_UNMOUNT_1, 1);
411         at91_set_deglitch(GPIO_CARD_UNMOUNT_1, 1);
412         at91_set_gpio_input(GPIO_KEY_POWER, 0);
413         at91_set_deglitch(GPIO_KEY_POWER, 1);
414
415         platform_device_register(&button_device);
416 }
417
418 /*
419  * I2C
420  */
421 static int pcf8574x_0x20_setup(struct i2c_client *client, int gpio,
422                                 unsigned int ngpio, void *context)
423 {
424         int status;
425
426         status = gpio_request(gpio + PCF_GPIO_ETH_DETECT, "eth_det");
427         if (status < 0) {
428                 pr_err("error: can't request GPIO%d\n",
429                         gpio + PCF_GPIO_ETH_DETECT);
430                 return status;
431         }
432         status = gpio_direction_input(gpio + PCF_GPIO_ETH_DETECT);
433         if (status < 0) {
434                 pr_err("error: can't setup GPIO%d as input\n",
435                         gpio + PCF_GPIO_ETH_DETECT);
436                 return status;
437         }
438         status = gpio_export(gpio + PCF_GPIO_ETH_DETECT, false);
439         if (status < 0) {
440                 pr_err("error: can't export GPIO%d\n",
441                         gpio + PCF_GPIO_ETH_DETECT);
442                 return status;
443         }
444         status = gpio_sysfs_set_active_low(gpio + PCF_GPIO_ETH_DETECT, 1);
445         if (status < 0) {
446                 pr_err("error: gpio_sysfs_set active_low(GPIO%d, 1)\n",
447                         gpio + PCF_GPIO_ETH_DETECT);
448                 return status;
449         }
450
451         return 0;
452 }
453
454 static int pcf8574x_0x20_teardown(struct i2c_client *client, int gpio,
455                                         unsigned ngpio, void *context)
456 {
457         gpio_free(gpio + PCF_GPIO_ETH_DETECT);
458         return 0;
459 }
460
461 static struct pcf857x_platform_data pcf20_pdata = {
462         .gpio_base      = GS_IA18_S_PCF_GPIO_BASE0,
463         .n_latch        = (1 << 4),
464         .setup          = pcf8574x_0x20_setup,
465         .teardown       = pcf8574x_0x20_teardown,
466 };
467
468 static struct pcf857x_platform_data pcf22_pdata = {
469         .gpio_base      = GS_IA18_S_PCF_GPIO_BASE1,
470 };
471
472 static struct pcf857x_platform_data pcf24_pdata = {
473         .gpio_base      = GS_IA18_S_PCF_GPIO_BASE2,
474 };
475
476 static struct i2c_board_info __initdata gsia18s_i2c_devices[] = {
477         { /* U1 on the GS_IA18-CB_V3 board */
478                 I2C_BOARD_INFO("pcf8574", 0x20),
479                 .platform_data = &pcf20_pdata,
480         },
481         { /* U1 on the GS_2G_OPT1-A_V0 board (Alarm) */
482                 I2C_BOARD_INFO("pcf8574", 0x22),
483                 .platform_data = &pcf22_pdata,
484         },
485         { /* U1 on the GS_2G-OPT23-A_V0 board (Modem) */
486                 I2C_BOARD_INFO("pcf8574", 0x24),
487                 .platform_data = &pcf24_pdata,
488         },
489         { /* U161 on the GS_IA18_S-MN board */
490                 I2C_BOARD_INFO("24c1024", 0x50),
491         },
492         { /* U162 on the GS_IA18_S-MN board */
493                 I2C_BOARD_INFO("24c01", 0x53),
494         },
495 };
496
497 /*
498  * Compact Flash
499  */
500 static struct at91_cf_data __initdata gsia18s_cf1_data = {
501         .irq_pin        = AT91_PIN_PA27,
502         .det_pin        = AT91_PIN_PB30,
503         .vcc_pin        = -EINVAL,
504         .rst_pin        = AT91_PIN_PB31,
505         .chipselect     = 5,
506         .flags          = AT91_CF_TRUE_IDE,
507 };
508
509 /* Power Off by RTC */
510 static void gsia18s_power_off(void)
511 {
512         pr_notice("Power supply will be switched off automatically now or after 60 seconds without ArmDAS.\n");
513         at91_set_gpio_output(AT91_PIN_PA25, 1);
514         /* Spin to death... */
515         while (1)
516                 ;
517 }
518
519 static int __init gsia18s_power_off_init(void)
520 {
521         pm_power_off = gsia18s_power_off;
522         return 0;
523 }
524
525 /* ---------------------------------------------------------------------------*/
526
527 static void __init gsia18s_board_init(void)
528 {
529         /*
530          * USART0 on ttyS1 (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI).
531          * Used for Internal Analog Modem.
532          */
533         at91_register_uart(AT91SAM9260_ID_US0, 1,
534                                 ATMEL_UART_CTS | ATMEL_UART_RTS |
535                                 ATMEL_UART_DTR | ATMEL_UART_DSR |
536                                 ATMEL_UART_DCD | ATMEL_UART_RI);
537         /*
538          * USART1 on ttyS2 (Rx, Tx, CTS, RTS).
539          * Used for GPS or WiFi or Data stream.
540          */
541         at91_register_uart(AT91SAM9260_ID_US1, 2,
542                                 ATMEL_UART_CTS | ATMEL_UART_RTS);
543         /*
544          * USART2 on ttyS3 (Rx, Tx, CTS, RTS).
545          * Used for External Modem.
546          */
547         at91_register_uart(AT91SAM9260_ID_US2, 3,
548                                 ATMEL_UART_CTS | ATMEL_UART_RTS);
549         /*
550          * USART3 on ttyS4 (Rx, Tx, RTS).
551          * Used for RS-485.
552          */
553         at91_register_uart(AT91SAM9260_ID_US3, 4, ATMEL_UART_RTS);
554
555         /*
556          * USART4 on ttyS5 (Rx, Tx).
557          * Used for TRX433 Radio Module.
558          */
559         at91_register_uart(AT91SAM9260_ID_US4, 5, 0);
560         stamp9g20_board_init();
561         at91_add_device_usbh(&usbh_data);
562         at91_add_device_udc(&udc_data);
563         at91_add_device_eth(&macb_data);
564         gsia18s_leds_init();
565         gsia18s_pcf_leds_init();
566         gsia18s_add_device_buttons();
567         at91_add_device_i2c(gsia18s_i2c_devices,
568                                 ARRAY_SIZE(gsia18s_i2c_devices));
569         at91_add_device_cf(&gsia18s_cf1_data);
570         at91_add_device_spi(gsia18s_spi_devices,
571                                 ARRAY_SIZE(gsia18s_spi_devices));
572         gsia18s_power_off_init();
573 }
574
575 MACHINE_START(GSIA18S, "GS_IA18_S")
576         .timer          = &at91sam926x_timer,
577         .map_io         = at91_map_io,
578         .init_early     = gsia18s_init_early,
579         .init_irq       = at91_init_irq_default,
580         .init_machine   = gsia18s_board_init,
581 MACHINE_END