2
* linux/arch/arm/mach-at91/board-csb337.c
4
* Copyright (C) 2005 SAN People
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.
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.
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
21
#include <linux/types.h>
22
#include <linux/gpio.h>
23
#include <linux/init.h>
25
#include <linux/module.h>
26
#include <linux/platform_device.h>
27
#include <linux/spi/spi.h>
28
#include <linux/mtd/physmap.h>
29
#include <linux/input.h>
30
#include <linux/gpio_keys.h>
32
#include <asm/setup.h>
33
#include <asm/mach-types.h>
36
#include <asm/mach/arch.h>
37
#include <asm/mach/map.h>
38
#include <asm/mach/irq.h>
40
#include <mach/hardware.h>
41
#include <mach/board.h>
46
static void __init csb337_init_early(void)
48
/* Initialize processor: 3.6864 MHz crystal */
49
at91_initialize(3686400);
52
at91_init_leds(AT91_PIN_PB0, AT91_PIN_PB1);
55
at91_register_uart(0, 0, 0);
57
/* make console=ttyS0 the default */
58
at91_set_serial_console(0);
61
static struct at91_eth_data __initdata csb337_eth_data = {
62
.phy_irq_pin = AT91_PIN_PC2,
66
static struct at91_usbh_data __initdata csb337_usbh_data = {
70
static struct at91_udc_data __initdata csb337_udc_data = {
71
// this has no VBUS sensing pin
72
.pullup_pin = AT91_PIN_PA24,
75
static struct i2c_board_info __initdata csb337_i2c_devices[] = {
77
I2C_BOARD_INFO("ds1307", 0x68),
81
static struct at91_cf_data __initdata csb337_cf_data = {
83
* connector P4 on the CSB 337 mates to
84
* connector P8 on the CSB 300CF
88
.det_pin = AT91_PIN_PC3,
90
/* CSB300CF specific */
91
.irq_pin = AT91_PIN_PA19,
92
.vcc_pin = AT91_PIN_PD0,
93
.rst_pin = AT91_PIN_PD2,
96
static struct at91_mmc_data __initdata csb337_mmc_data = {
97
.det_pin = AT91_PIN_PD5,
100
.wp_pin = AT91_PIN_PD6,
103
static struct spi_board_info csb337_spi_devices[] = {
104
{ /* CAN controller */
105
.modalias = "sak82c900",
107
.max_speed_hz = 6 * 1000 * 1000,
111
#define CSB_FLASH_BASE AT91_CHIPSELECT_0
112
#define CSB_FLASH_SIZE SZ_8M
114
static struct mtd_partition csb_flash_partitions[] = {
116
.name = "uMON flash",
118
.size = MTDPART_SIZ_FULL,
119
.mask_flags = MTD_WRITEABLE, /* read only */
123
static struct physmap_flash_data csb_flash_data = {
125
.parts = csb_flash_partitions,
126
.nr_parts = ARRAY_SIZE(csb_flash_partitions),
129
static struct resource csb_flash_resources[] = {
131
.start = CSB_FLASH_BASE,
132
.end = CSB_FLASH_BASE + CSB_FLASH_SIZE - 1,
133
.flags = IORESOURCE_MEM,
137
static struct platform_device csb_flash = {
138
.name = "physmap-flash",
141
.platform_data = &csb_flash_data,
143
.resource = csb_flash_resources,
144
.num_resources = ARRAY_SIZE(csb_flash_resources),
148
* GPIO Buttons (on CSB300)
150
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
151
static struct gpio_keys_button csb300_buttons[] = {
153
.gpio = AT91_PIN_PB29,
160
.gpio = AT91_PIN_PB28,
167
.gpio = AT91_PIN_PA21,
175
static struct gpio_keys_platform_data csb300_button_data = {
176
.buttons = csb300_buttons,
177
.nbuttons = ARRAY_SIZE(csb300_buttons),
180
static struct platform_device csb300_button_device = {
185
.platform_data = &csb300_button_data,
189
static void __init csb300_add_device_buttons(void)
191
at91_set_gpio_input(AT91_PIN_PB29, 1); /* sw0 */
192
at91_set_deglitch(AT91_PIN_PB29, 1);
193
at91_set_gpio_input(AT91_PIN_PB28, 1); /* sw1 */
194
at91_set_deglitch(AT91_PIN_PB28, 1);
195
at91_set_gpio_input(AT91_PIN_PA21, 1); /* sw2 */
196
at91_set_deglitch(AT91_PIN_PA21, 1);
198
platform_device_register(&csb300_button_device);
201
static void __init csb300_add_device_buttons(void) {}
204
static struct gpio_led csb_leds[] = {
205
{ /* "led0", yellow */
207
.gpio = AT91_PIN_PB2,
209
.default_trigger = "heartbeat",
211
{ /* "led1", green */
213
.gpio = AT91_PIN_PB1,
215
.default_trigger = "mmc0",
217
{ /* "led2", yellow */
219
.gpio = AT91_PIN_PB0,
221
.default_trigger = "ide-disk",
226
static void __init csb337_board_init(void)
229
at91_add_device_serial();
231
at91_add_device_eth(&csb337_eth_data);
233
at91_add_device_usbh(&csb337_usbh_data);
235
at91_add_device_udc(&csb337_udc_data);
237
at91_add_device_i2c(csb337_i2c_devices, ARRAY_SIZE(csb337_i2c_devices));
239
at91_set_gpio_input(AT91_PIN_PB22, 1); /* IOIS16 */
240
at91_add_device_cf(&csb337_cf_data);
242
at91_add_device_spi(csb337_spi_devices, ARRAY_SIZE(csb337_spi_devices));
244
at91_add_device_mmc(0, &csb337_mmc_data);
246
platform_device_register(&csb_flash);
248
at91_gpio_leds(csb_leds, ARRAY_SIZE(csb_leds));
249
/* Switches on CSB300 */
250
csb300_add_device_buttons();
253
MACHINE_START(CSB337, "Cogent CSB337")
254
/* Maintainer: Bill Gatliff */
255
.timer = &at91rm9200_timer,
256
.map_io = at91_map_io,
257
.init_early = csb337_init_early,
258
.init_irq = at91_init_irq_default,
259
.init_machine = csb337_board_init,