Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/arm/mach-at91/board-csb337.c
10817 views
1
/*
2
* linux/arch/arm/mach-at91/board-csb337.c
3
*
4
* Copyright (C) 2005 SAN People
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
*/
20
21
#include <linux/types.h>
22
#include <linux/init.h>
23
#include <linux/mm.h>
24
#include <linux/module.h>
25
#include <linux/platform_device.h>
26
#include <linux/spi/spi.h>
27
#include <linux/mtd/physmap.h>
28
#include <linux/input.h>
29
#include <linux/gpio_keys.h>
30
31
#include <asm/setup.h>
32
#include <asm/mach-types.h>
33
#include <asm/irq.h>
34
35
#include <asm/mach/arch.h>
36
#include <asm/mach/map.h>
37
#include <asm/mach/irq.h>
38
39
#include <mach/hardware.h>
40
#include <mach/board.h>
41
#include <mach/gpio.h>
42
43
#include "generic.h"
44
45
46
static void __init csb337_init_early(void)
47
{
48
/* Initialize processor: 3.6864 MHz crystal */
49
at91rm9200_initialize(3686400);
50
51
/* Setup the LEDs */
52
at91_init_leds(AT91_PIN_PB0, AT91_PIN_PB1);
53
54
/* DBGU on ttyS0 */
55
at91_register_uart(0, 0, 0);
56
57
/* make console=ttyS0 the default */
58
at91_set_serial_console(0);
59
}
60
61
static void __init csb337_init_irq(void)
62
{
63
at91rm9200_init_interrupts(NULL);
64
}
65
66
static struct at91_eth_data __initdata csb337_eth_data = {
67
.phy_irq_pin = AT91_PIN_PC2,
68
.is_rmii = 0,
69
};
70
71
static struct at91_usbh_data __initdata csb337_usbh_data = {
72
.ports = 2,
73
};
74
75
static struct at91_udc_data __initdata csb337_udc_data = {
76
// this has no VBUS sensing pin
77
.pullup_pin = AT91_PIN_PA24,
78
};
79
80
static struct i2c_board_info __initdata csb337_i2c_devices[] = {
81
{
82
I2C_BOARD_INFO("ds1307", 0x68),
83
},
84
};
85
86
static struct at91_cf_data __initdata csb337_cf_data = {
87
/*
88
* connector P4 on the CSB 337 mates to
89
* connector P8 on the CSB 300CF
90
*/
91
92
/* CSB337 specific */
93
.det_pin = AT91_PIN_PC3,
94
95
/* CSB300CF specific */
96
.irq_pin = AT91_PIN_PA19,
97
.vcc_pin = AT91_PIN_PD0,
98
.rst_pin = AT91_PIN_PD2,
99
};
100
101
static struct at91_mmc_data __initdata csb337_mmc_data = {
102
.det_pin = AT91_PIN_PD5,
103
.slot_b = 0,
104
.wire4 = 1,
105
.wp_pin = AT91_PIN_PD6,
106
};
107
108
static struct spi_board_info csb337_spi_devices[] = {
109
{ /* CAN controller */
110
.modalias = "sak82c900",
111
.chip_select = 0,
112
.max_speed_hz = 6 * 1000 * 1000,
113
},
114
};
115
116
#define CSB_FLASH_BASE AT91_CHIPSELECT_0
117
#define CSB_FLASH_SIZE SZ_8M
118
119
static struct mtd_partition csb_flash_partitions[] = {
120
{
121
.name = "uMON flash",
122
.offset = 0,
123
.size = MTDPART_SIZ_FULL,
124
.mask_flags = MTD_WRITEABLE, /* read only */
125
}
126
};
127
128
static struct physmap_flash_data csb_flash_data = {
129
.width = 2,
130
.parts = csb_flash_partitions,
131
.nr_parts = ARRAY_SIZE(csb_flash_partitions),
132
};
133
134
static struct resource csb_flash_resources[] = {
135
{
136
.start = CSB_FLASH_BASE,
137
.end = CSB_FLASH_BASE + CSB_FLASH_SIZE - 1,
138
.flags = IORESOURCE_MEM,
139
}
140
};
141
142
static struct platform_device csb_flash = {
143
.name = "physmap-flash",
144
.id = 0,
145
.dev = {
146
.platform_data = &csb_flash_data,
147
},
148
.resource = csb_flash_resources,
149
.num_resources = ARRAY_SIZE(csb_flash_resources),
150
};
151
152
/*
153
* GPIO Buttons (on CSB300)
154
*/
155
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
156
static struct gpio_keys_button csb300_buttons[] = {
157
{
158
.gpio = AT91_PIN_PB29,
159
.code = BTN_0,
160
.desc = "sw0",
161
.active_low = 1,
162
.wakeup = 1,
163
},
164
{
165
.gpio = AT91_PIN_PB28,
166
.code = BTN_1,
167
.desc = "sw1",
168
.active_low = 1,
169
.wakeup = 1,
170
},
171
{
172
.gpio = AT91_PIN_PA21,
173
.code = BTN_2,
174
.desc = "sw2",
175
.active_low = 1,
176
.wakeup = 1,
177
}
178
};
179
180
static struct gpio_keys_platform_data csb300_button_data = {
181
.buttons = csb300_buttons,
182
.nbuttons = ARRAY_SIZE(csb300_buttons),
183
};
184
185
static struct platform_device csb300_button_device = {
186
.name = "gpio-keys",
187
.id = -1,
188
.num_resources = 0,
189
.dev = {
190
.platform_data = &csb300_button_data,
191
}
192
};
193
194
static void __init csb300_add_device_buttons(void)
195
{
196
at91_set_gpio_input(AT91_PIN_PB29, 1); /* sw0 */
197
at91_set_deglitch(AT91_PIN_PB29, 1);
198
at91_set_gpio_input(AT91_PIN_PB28, 1); /* sw1 */
199
at91_set_deglitch(AT91_PIN_PB28, 1);
200
at91_set_gpio_input(AT91_PIN_PA21, 1); /* sw2 */
201
at91_set_deglitch(AT91_PIN_PA21, 1);
202
203
platform_device_register(&csb300_button_device);
204
}
205
#else
206
static void __init csb300_add_device_buttons(void) {}
207
#endif
208
209
static struct gpio_led csb_leds[] = {
210
{ /* "led0", yellow */
211
.name = "led0",
212
.gpio = AT91_PIN_PB2,
213
.active_low = 1,
214
.default_trigger = "heartbeat",
215
},
216
{ /* "led1", green */
217
.name = "led1",
218
.gpio = AT91_PIN_PB1,
219
.active_low = 1,
220
.default_trigger = "mmc0",
221
},
222
{ /* "led2", yellow */
223
.name = "led2",
224
.gpio = AT91_PIN_PB0,
225
.active_low = 1,
226
.default_trigger = "ide-disk",
227
}
228
};
229
230
231
static void __init csb337_board_init(void)
232
{
233
/* Serial */
234
at91_add_device_serial();
235
/* Ethernet */
236
at91_add_device_eth(&csb337_eth_data);
237
/* USB Host */
238
at91_add_device_usbh(&csb337_usbh_data);
239
/* USB Device */
240
at91_add_device_udc(&csb337_udc_data);
241
/* I2C */
242
at91_add_device_i2c(csb337_i2c_devices, ARRAY_SIZE(csb337_i2c_devices));
243
/* Compact Flash */
244
at91_set_gpio_input(AT91_PIN_PB22, 1); /* IOIS16 */
245
at91_add_device_cf(&csb337_cf_data);
246
/* SPI */
247
at91_add_device_spi(csb337_spi_devices, ARRAY_SIZE(csb337_spi_devices));
248
/* MMC */
249
at91_add_device_mmc(0, &csb337_mmc_data);
250
/* NOR flash */
251
platform_device_register(&csb_flash);
252
/* LEDs */
253
at91_gpio_leds(csb_leds, ARRAY_SIZE(csb_leds));
254
/* Switches on CSB300 */
255
csb300_add_device_buttons();
256
}
257
258
MACHINE_START(CSB337, "Cogent CSB337")
259
/* Maintainer: Bill Gatliff */
260
.timer = &at91rm9200_timer,
261
.map_io = at91rm9200_map_io,
262
.init_early = csb337_init_early,
263
.init_irq = csb337_init_irq,
264
.init_machine = csb337_board_init,
265
MACHINE_END
266
267