1/* 2 * linux/arch/arm/mach-at91/board-usb-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 51static void __init ek_map_io(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 /* set serial console to ttyS0 (ie, DBGU) */ 60 at91_set_serial_console(0); 61} 62 63static void __init ek_init_irq(void) 64{ 65 at91sam9260_init_interrupts(NULL); 66} 67 68 69/* 70 * USB Host port 71 */ 72static struct at91_usbh_data __initdata ek_usbh_data = { 73 .ports = 2, 74}; 75 76/* 77 * USB Device port 78 */ 79static struct at91_udc_data __initdata ek_udc_data = { 80 .vbus_pin = AT91_PIN_PC5, 81 .pullup_pin = 0, /* pull-up driven by UDC */ 82}; 83 84/* 85 * MACB Ethernet device 86 */ 87static struct at91_eth_data __initdata ek_macb_data = { 88 .phy_irq_pin = AT91_PIN_PA31, 89 .is_rmii = 1, 90}; 91 92/* 93 * NAND flash 94 */ 95static struct mtd_partition __initdata ek_nand_partition[] = { 96 { 97 .name = "Uboot & Kernel", 98 .offset = 0, 99 .size = SZ_16M, 100 }, 101 { 102 .name = "Root FS", 103 .offset = MTDPART_OFS_NXTBLK, 104 .size = 120 * SZ_1M, 105 }, 106 { 107 .name = "FS", 108 .offset = MTDPART_OFS_NXTBLK, 109 .size = 120 * SZ_1M, 110 } 111}; 112 113static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) 114{ 115 *num_partitions = ARRAY_SIZE(ek_nand_partition); 116 return ek_nand_partition; 117} 118 119static struct atmel_nand_data __initdata ek_nand_data = { 120 .ale = 21, 121 .cle = 22, 122// .det_pin = ... not connected 123 .rdy_pin = AT91_PIN_PC13, 124 .enable_pin = AT91_PIN_PC14, 125 .partition_info = nand_partitions, 126}; 127 128static struct sam9_smc_config __initdata ek_nand_smc_config = { 129 .ncs_read_setup = 0, 130 .nrd_setup = 1, 131 .ncs_write_setup = 0, 132 .nwe_setup = 1, 133 134 .ncs_read_pulse = 3, 135 .nrd_pulse = 3, 136 .ncs_write_pulse = 3, 137 .nwe_pulse = 3, 138 139 .read_cycle = 5, 140 .write_cycle = 5, 141 142 .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8, 143 .tdf_cycles = 2, 144}; 145 146static void __init ek_add_device_nand(void) 147{ 148 /* configure chip-select 3 (NAND) */ 149 sam9_smc_configure(3, &ek_nand_smc_config); 150 151 at91_add_device_nand(&ek_nand_data); 152} 153 154/* 155 * GPIO Buttons 156 */ 157 158#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) 159static struct gpio_keys_button ek_buttons[] = { 160 { /* USER PUSH BUTTON */ 161 .code = KEY_ENTER, 162 .gpio = AT91_PIN_PB10, 163 .active_low = 1, 164 .desc = "user_pb", 165 .wakeup = 1, 166 } 167}; 168 169static struct gpio_keys_platform_data ek_button_data = { 170 .buttons = ek_buttons, 171 .nbuttons = ARRAY_SIZE(ek_buttons), 172}; 173 174static struct platform_device ek_button_device = { 175 .name = "gpio-keys", 176 .id = -1, 177 .num_resources = 0, 178 .dev = { 179 .platform_data = &ek_button_data, 180 } 181}; 182 183static void __init ek_add_device_buttons(void) 184{ 185 at91_set_GPIO_periph(AT91_PIN_PB10, 1); /* user push button, pull up enabled */ 186 at91_set_deglitch(AT91_PIN_PB10, 1); 187 188 platform_device_register(&ek_button_device); 189} 190#else 191static void __init ek_add_device_buttons(void) {} 192#endif 193 194/* 195 * LEDs 196 */ 197static struct gpio_led ek_leds[] = { 198 { /* user_led (green) */ 199 .name = "user_led", 200 .gpio = AT91_PIN_PB21, 201 .active_low = 0, 202 .default_trigger = "heartbeat", 203 } 204}; 205 206static void __init ek_board_init(void) 207{ 208 /* Serial */ 209 at91_add_device_serial(); 210 /* USB Host */ 211 at91_add_device_usbh(&ek_usbh_data); 212 /* USB Device */ 213 at91_add_device_udc(&ek_udc_data); 214 /* NAND */ 215 ek_add_device_nand(); 216 /* I2C */ 217 at91_add_device_i2c(NULL, 0); 218 /* Ethernet */ 219 at91_add_device_eth(&ek_macb_data); 220 /* Push Buttons */ 221 ek_add_device_buttons(); 222 /* LEDs */ 223 at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds)); 224 /* shutdown controller, wakeup button (5 msec low) */ 225 at91_sys_write(AT91_SHDW_MR, AT91_SHDW_CPTWK0_(10) | AT91_SHDW_WKMODE0_LOW 226 | AT91_SHDW_RTTWKEN); 227} 228 229MACHINE_START(USB_A9260, "CALAO USB_A9260") 230 /* Maintainer: calao-systems */ 231 .phys_io = AT91_BASE_SYS, 232 .io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc, 233 .boot_params = AT91_SDRAM_BASE + 0x100, 234 .timer = &at91sam926x_timer, 235 .map_io = ek_map_io, 236 .init_irq = ek_init_irq, 237 .init_machine = ek_board_init, 238MACHINE_END 239