Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/arm/mach-at91/board-qil-a9260.c
10817 views
1
/*
2
* linux/arch/arm/mach-at91/board-qil-a9260.c
3
*
4
* Copyright (C) 2005 SAN People
5
* Copyright (C) 2006 Atmel
6
* Copyright (C) 2007 Calao-systems
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/types.h>
24
#include <linux/init.h>
25
#include <linux/mm.h>
26
#include <linux/module.h>
27
#include <linux/platform_device.h>
28
#include <linux/spi/spi.h>
29
#include <linux/gpio_keys.h>
30
#include <linux/input.h>
31
#include <linux/clk.h>
32
33
#include <asm/setup.h>
34
#include <asm/mach-types.h>
35
#include <asm/irq.h>
36
37
#include <asm/mach/arch.h>
38
#include <asm/mach/map.h>
39
#include <asm/mach/irq.h>
40
41
#include <mach/hardware.h>
42
#include <mach/board.h>
43
#include <mach/gpio.h>
44
#include <mach/at91sam9_smc.h>
45
#include <mach/at91_shdwc.h>
46
47
#include "sam9_smc.h"
48
#include "generic.h"
49
50
51
static void __init ek_init_early(void)
52
{
53
/* Initialize processor: 12.000 MHz crystal */
54
at91sam9260_initialize(12000000);
55
56
/* DBGU on ttyS0. (Rx & Tx only) */
57
at91_register_uart(0, 0, 0);
58
59
/* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */
60
at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS
61
| ATMEL_UART_DTR | ATMEL_UART_DSR | ATMEL_UART_DCD
62
| ATMEL_UART_RI);
63
64
/* USART1 on ttyS2. (Rx, Tx, CTS, RTS) */
65
at91_register_uart(AT91SAM9260_ID_US1, 2, ATMEL_UART_CTS | ATMEL_UART_RTS);
66
67
/* USART2 on ttyS3. (Rx, Tx, CTS, RTS) */
68
at91_register_uart(AT91SAM9260_ID_US2, 3, ATMEL_UART_CTS | ATMEL_UART_RTS);
69
70
/* set serial console to ttyS1 (ie, USART0) */
71
at91_set_serial_console(1);
72
73
}
74
75
static void __init ek_init_irq(void)
76
{
77
at91sam9260_init_interrupts(NULL);
78
}
79
80
81
/*
82
* USB Host port
83
*/
84
static struct at91_usbh_data __initdata ek_usbh_data = {
85
.ports = 2,
86
};
87
88
/*
89
* USB Device port
90
*/
91
static struct at91_udc_data __initdata ek_udc_data = {
92
.vbus_pin = AT91_PIN_PC5,
93
.pullup_pin = 0, /* pull-up driven by UDC */
94
};
95
96
/*
97
* SPI devices.
98
*/
99
static struct spi_board_info ek_spi_devices[] = {
100
#if defined(CONFIG_RTC_DRV_M41T94)
101
{ /* M41T94 RTC */
102
.modalias = "m41t94",
103
.chip_select = 0,
104
.max_speed_hz = 1 * 1000 * 1000,
105
.bus_num = 0,
106
}
107
#endif
108
};
109
110
/*
111
* MACB Ethernet device
112
*/
113
static struct at91_eth_data __initdata ek_macb_data = {
114
.phy_irq_pin = AT91_PIN_PA31,
115
.is_rmii = 1,
116
};
117
118
/*
119
* NAND flash
120
*/
121
static struct mtd_partition __initdata ek_nand_partition[] = {
122
{
123
.name = "Uboot & Kernel",
124
.offset = 0,
125
.size = SZ_16M,
126
},
127
{
128
.name = "Root FS",
129
.offset = MTDPART_OFS_NXTBLK,
130
.size = 120 * SZ_1M,
131
},
132
{
133
.name = "FS",
134
.offset = MTDPART_OFS_NXTBLK,
135
.size = 120 * SZ_1M,
136
},
137
};
138
139
static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
140
{
141
*num_partitions = ARRAY_SIZE(ek_nand_partition);
142
return ek_nand_partition;
143
}
144
145
static struct atmel_nand_data __initdata ek_nand_data = {
146
.ale = 21,
147
.cle = 22,
148
// .det_pin = ... not connected
149
.rdy_pin = AT91_PIN_PC13,
150
.enable_pin = AT91_PIN_PC14,
151
.partition_info = nand_partitions,
152
};
153
154
static struct sam9_smc_config __initdata ek_nand_smc_config = {
155
.ncs_read_setup = 0,
156
.nrd_setup = 1,
157
.ncs_write_setup = 0,
158
.nwe_setup = 1,
159
160
.ncs_read_pulse = 3,
161
.nrd_pulse = 3,
162
.ncs_write_pulse = 3,
163
.nwe_pulse = 3,
164
165
.read_cycle = 5,
166
.write_cycle = 5,
167
168
.mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8,
169
.tdf_cycles = 2,
170
};
171
172
static void __init ek_add_device_nand(void)
173
{
174
/* configure chip-select 3 (NAND) */
175
sam9_smc_configure(3, &ek_nand_smc_config);
176
177
at91_add_device_nand(&ek_nand_data);
178
}
179
180
/*
181
* MCI (SD/MMC)
182
*/
183
static struct at91_mmc_data __initdata ek_mmc_data = {
184
.slot_b = 0,
185
.wire4 = 1,
186
// .det_pin = ... not connected
187
// .wp_pin = ... not connected
188
// .vcc_pin = ... not connected
189
};
190
191
/*
192
* GPIO Buttons
193
*/
194
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
195
static struct gpio_keys_button ek_buttons[] = {
196
{ /* USER PUSH BUTTON */
197
.code = KEY_ENTER,
198
.gpio = AT91_PIN_PB10,
199
.active_low = 1,
200
.desc = "user_pb",
201
.wakeup = 1,
202
}
203
};
204
205
static struct gpio_keys_platform_data ek_button_data = {
206
.buttons = ek_buttons,
207
.nbuttons = ARRAY_SIZE(ek_buttons),
208
};
209
210
static struct platform_device ek_button_device = {
211
.name = "gpio-keys",
212
.id = -1,
213
.num_resources = 0,
214
.dev = {
215
.platform_data = &ek_button_data,
216
}
217
};
218
219
static void __init ek_add_device_buttons(void)
220
{
221
at91_set_GPIO_periph(AT91_PIN_PB10, 1); /* user push button, pull up enabled */
222
at91_set_deglitch(AT91_PIN_PB10, 1);
223
224
platform_device_register(&ek_button_device);
225
}
226
#else
227
static void __init ek_add_device_buttons(void) {}
228
#endif
229
230
/*
231
* LEDs
232
*/
233
static struct gpio_led ek_leds[] = {
234
{ /* user_led (green) */
235
.name = "user_led",
236
.gpio = AT91_PIN_PB21,
237
.active_low = 0,
238
.default_trigger = "heartbeat",
239
}
240
};
241
242
static void __init ek_board_init(void)
243
{
244
/* Serial */
245
at91_add_device_serial();
246
/* USB Host */
247
at91_add_device_usbh(&ek_usbh_data);
248
/* USB Device */
249
at91_add_device_udc(&ek_udc_data);
250
/* SPI */
251
at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
252
/* NAND */
253
ek_add_device_nand();
254
/* I2C */
255
at91_add_device_i2c(NULL, 0);
256
/* Ethernet */
257
at91_add_device_eth(&ek_macb_data);
258
/* MMC */
259
at91_add_device_mmc(0, &ek_mmc_data);
260
/* Push Buttons */
261
ek_add_device_buttons();
262
/* LEDs */
263
at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
264
/* shutdown controller, wakeup button (5 msec low) */
265
at91_sys_write(AT91_SHDW_MR, AT91_SHDW_CPTWK0_(10) | AT91_SHDW_WKMODE0_LOW
266
| AT91_SHDW_RTTWKEN);
267
}
268
269
MACHINE_START(QIL_A9260, "CALAO QIL_A9260")
270
/* Maintainer: calao-systems */
271
.timer = &at91sam926x_timer,
272
.map_io = at91sam9260_map_io,
273
.init_early = ek_init_early,
274
.init_irq = ek_init_irq,
275
.init_machine = ek_board_init,
276
MACHINE_END
277
278