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